update: init

This commit is contained in:
admin 2024-03-04 15:10:11 +08:00
commit 883b7be35d
156 changed files with 19080 additions and 0 deletions

View File

@ -0,0 +1,67 @@
{
"globals": {
"Component": true,
"ComponentPublicInstance": true,
"ComputedRef": true,
"EffectScope": true,
"ExtractDefaultPropTypes": true,
"ExtractPropTypes": true,
"ExtractPublicPropTypes": true,
"InjectionKey": true,
"PropType": true,
"Ref": true,
"VNode": true,
"WritableComputedRef": true,
"computed": true,
"createApp": true,
"customRef": true,
"defineAsyncComponent": true,
"defineComponent": true,
"effectScope": true,
"getCurrentInstance": true,
"getCurrentScope": true,
"h": true,
"inject": true,
"isProxy": true,
"isReactive": true,
"isReadonly": true,
"isRef": true,
"markRaw": true,
"nextTick": true,
"onActivated": true,
"onBeforeMount": true,
"onBeforeUnmount": true,
"onBeforeUpdate": true,
"onDeactivated": true,
"onErrorCaptured": true,
"onMounted": true,
"onRenderTracked": true,
"onRenderTriggered": true,
"onScopeDispose": true,
"onServerPrefetch": true,
"onUnmounted": true,
"onUpdated": true,
"provide": true,
"reactive": true,
"readonly": true,
"ref": true,
"resolveComponent": true,
"shallowReactive": true,
"shallowReadonly": true,
"shallowRef": true,
"toRaw": true,
"toRef": true,
"toRefs": true,
"toValue": true,
"triggerRef": true,
"unref": true,
"useAttrs": true,
"useCssModule": true,
"useCssVars": true,
"useSlots": true,
"watch": true,
"watchEffect": true,
"watchPostEffect": true,
"watchSyncEffect": true
}
}

11
.eslintrc.js Normal file
View File

@ -0,0 +1,11 @@
module.exports = {
"extends": [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier',
'plugin:prettier/recommended', // 添加 prettier 插件,
]
}

21
.gitignore vendored Normal file
View File

@ -0,0 +1,21 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

20
index.html Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

88
package.json Normal file
View File

@ -0,0 +1,88 @@
{
"name": "uni-preset-vue",
"version": "0.0.0",
"scripts": {
"dev:app": "uni -p app",
"dev:app-android": "uni -p app-android",
"dev:app-ios": "uni -p app-ios",
"dev:custom": "uni -p",
"dev:h5": "uni",
"dev:h5:ssr": "uni --ssr",
"dev:mp-alipay": "uni -p mp-alipay",
"dev:mp-baidu": "uni -p mp-baidu",
"dev:mp-jd": "uni -p mp-jd",
"dev:mp-kuaishou": "uni -p mp-kuaishou",
"dev:mp-lark": "uni -p mp-lark",
"dev:mp-qq": "uni -p mp-qq",
"dev:mp-toutiao": "uni -p mp-toutiao",
"dev:mp-weixin": "uni -p mp-weixin",
"dev:quickapp-webview": "uni -p quickapp-webview",
"dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei",
"dev:quickapp-webview-union": "uni -p quickapp-webview-union",
"build:app": "uni build -p app",
"build:app-android": "uni build -p app-android",
"build:app-ios": "uni build -p app-ios",
"build:custom": "uni build -p",
"build:h5": "uni build",
"build:h5:ssr": "uni build --ssr",
"build:mp-alipay": "uni build -p mp-alipay",
"build:mp-baidu": "uni build -p mp-baidu",
"build:mp-jd": "uni build -p mp-jd",
"build:mp-kuaishou": "uni build -p mp-kuaishou",
"build:mp-lark": "uni build -p mp-lark",
"build:mp-qq": "uni build -p mp-qq",
"build:mp-toutiao": "uni build -p mp-toutiao",
"build:mp-weixin": "uni build -p mp-weixin",
"build:quickapp-webview": "uni build -p quickapp-webview",
"build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei",
"build:quickapp-webview-union": "uni build -p quickapp-webview-union",
"type-check": "vue-tsc --noEmit"
},
"dependencies": {
"@dcloudio/uni-app": "3.0.0-3081220230817001",
"@dcloudio/uni-app-plus": "3.0.0-3081220230817001",
"@dcloudio/uni-components": "3.0.0-3081220230817001",
"@dcloudio/uni-h5": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-alipay": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-baidu": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-jd": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-kuaishou": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-lark": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-qq": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-toutiao": "3.0.0-3081220230817001",
"@dcloudio/uni-mp-weixin": "3.0.0-3081220230817001",
"@dcloudio/uni-quickapp-webview": "3.0.0-3081220230817001",
"@dcloudio/uni-ui": "^1.5.2",
"amfe-flexible": "^2.2.1",
"clipboard": "^2.0.11",
"dayjs": "^1.11.10",
"echarts": "^5.5.0",
"esbuild": "0.17.19",
"luch-request": "^3.1.1",
"pinia": "2.0.33",
"pinia-plugin-persistedstate": "^3.2.1",
"postcss-pxtorem": "^6.0.0",
"unplugin-auto-import": "^0.17.3",
"uview-plus": "^3.1.41",
"vue": "^3.2.45",
"vue-i18n": "^9.1.9"
},
"devDependencies": {
"@dcloudio/types": "^3.3.2",
"@dcloudio/uni-automator": "3.0.0-3081220230817001",
"@dcloudio/uni-cli-shared": "3.0.0-3081220230817001",
"@dcloudio/uni-stacktracey": "3.0.0-3081220230817001",
"@dcloudio/vite-plugin-uni": "3.0.0-3081220230817001",
"@types/node": "^20.11.22",
"@types/wechat-miniprogram": "^3.4.7",
"@uni-helper/uni-app-types": "^0.5.12",
"@uni-helper/uni-ui-types": "^0.5.11",
"@vue/runtime-core": "^3.2.45",
"@vue/tsconfig": "^0.1.3",
"sass": "^1.69.7",
"sass-loader": "10",
"typescript": "^4.9.4",
"vite": "4.1.4",
"vue-tsc": "^1.0.24"
}
}

7293
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load Diff

10
shims-uni.d.ts vendored Normal file
View File

@ -0,0 +1,10 @@
/// <reference types='@dcloudio/types' />
import 'vue'
declare module '@vue/runtime-core' {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {
}
}

8
src/.postcssrc.js Normal file
View File

@ -0,0 +1,8 @@
module.exports = {
plugins: {
"postcss-pxtorem": {
rootValue: 37.5,
propList: ["*"],
},
},
};

20
src/App.vue Normal file
View File

@ -0,0 +1,20 @@
<script setup lang="ts">
import { onLaunch, onShow, onHide } from "@dcloudio/uni-app";
onLaunch(() => {
console.log("App Launch");
});
onShow(() => {
console.log("App Show");
});
onHide(() => {
console.log("App Hide");
});
</script>
<style lang="scss">
/* 注意要写在第一行同时给style标签加入lang="scss"属性 */
@import "uview-plus/index.scss";
body {
font-size: 12px;
}
</style>

66
src/auto-import.d.ts vendored Normal file
View File

@ -0,0 +1,66 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
export {}
declare global {
const EffectScope: typeof import('vue')['EffectScope']
const computed: typeof import('vue')['computed']
const createApp: typeof import('vue')['createApp']
const customRef: typeof import('vue')['customRef']
const defineAsyncComponent: typeof import('vue')['defineAsyncComponent']
const defineComponent: typeof import('vue')['defineComponent']
const effectScope: typeof import('vue')['effectScope']
const getCurrentInstance: typeof import('vue')['getCurrentInstance']
const getCurrentScope: typeof import('vue')['getCurrentScope']
const h: typeof import('vue')['h']
const inject: typeof import('vue')['inject']
const isProxy: typeof import('vue')['isProxy']
const isReactive: typeof import('vue')['isReactive']
const isReadonly: typeof import('vue')['isReadonly']
const isRef: typeof import('vue')['isRef']
const markRaw: typeof import('vue')['markRaw']
const nextTick: typeof import('vue')['nextTick']
const onActivated: typeof import('vue')['onActivated']
const onBeforeMount: typeof import('vue')['onBeforeMount']
const onBeforeUnmount: typeof import('vue')['onBeforeUnmount']
const onBeforeUpdate: typeof import('vue')['onBeforeUpdate']
const onDeactivated: typeof import('vue')['onDeactivated']
const onErrorCaptured: typeof import('vue')['onErrorCaptured']
const onMounted: typeof import('vue')['onMounted']
const onRenderTracked: typeof import('vue')['onRenderTracked']
const onRenderTriggered: typeof import('vue')['onRenderTriggered']
const onScopeDispose: typeof import('vue')['onScopeDispose']
const onServerPrefetch: typeof import('vue')['onServerPrefetch']
const onUnmounted: typeof import('vue')['onUnmounted']
const onUpdated: typeof import('vue')['onUpdated']
const provide: typeof import('vue')['provide']
const reactive: typeof import('vue')['reactive']
const readonly: typeof import('vue')['readonly']
const ref: typeof import('vue')['ref']
const resolveComponent: typeof import('vue')['resolveComponent']
const shallowReactive: typeof import('vue')['shallowReactive']
const shallowReadonly: typeof import('vue')['shallowReadonly']
const shallowRef: typeof import('vue')['shallowRef']
const toRaw: typeof import('vue')['toRaw']
const toRef: typeof import('vue')['toRef']
const toRefs: typeof import('vue')['toRefs']
const toValue: typeof import('vue')['toValue']
const triggerRef: typeof import('vue')['triggerRef']
const unref: typeof import('vue')['unref']
const useAttrs: typeof import('vue')['useAttrs']
const useCssModule: typeof import('vue')['useCssModule']
const useCssVars: typeof import('vue')['useCssVars']
const useSlots: typeof import('vue')['useSlots']
const watch: typeof import('vue')['watch']
const watchEffect: typeof import('vue')['watchEffect']
const watchPostEffect: typeof import('vue')['watchPostEffect']
const watchSyncEffect: typeof import('vue')['watchSyncEffect']
}
// for type re-export
declare global {
// @ts-ignore
export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue'
import('vue')
}

View File

@ -0,0 +1,80 @@
<template>
<view class="carousel">
<swiper
:circular="true"
:autoplay="true"
:interval="3000"
@change="onChange"
>
<swiper-item v-for="item in list" :key="item.id">
<navigator :url="item.herfUrl" hover-class="none" class="navigator">
<image mode="aspectFill" class="image" :src="item.imgUrl"></image>
</navigator>
</swiper-item>
</swiper>
<!-- 指示点 -->
<view class="indicator">
<text
v-for="(item, index) in list"
:key="item.id"
class="dot"
:class="{ active: index === activeIndex }"
></text>
</view>
</view>
</template>
<script setup lang="ts">
import type { BannerItem } from '@/types/home';
const activeIndex = ref(0)
const onChange: UniHelper.SwiperOnChange = (ev) => {
activeIndex.value = ev.detail.current
}
const props = defineProps<{
list: BannerItem[],
}>()
</script>
<style lang="scss">
:host {
display: block;
height: 280rpx;
}
/* 轮播图 */
.carousel {
// height: 100%;
position: relative;
overflow: hidden;
transform: translateY(0);
background-color: #efefef;
.indicator {
position: absolute;
left: 0;
right: 0;
bottom: 16rpx;
display: flex;
justify-content: center;
.dot {
width: 30rpx;
height: 6rpx;
margin: 0 8rpx;
border-radius: 6rpx;
background-color: rgba(255, 255, 255, 0.4);
}
.active {
background-color: #fff;
}
}
.navigator,
.image {
width: 100%;
height: 100%;
}
}
</style>

View File

@ -0,0 +1,15 @@
<template>
<view class="box">
<slot></slot>
</view>
</template>
<script setup lang="ts"></script>
<style lang="scss">
.box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 24.36rpx 25.64rpx;
padding: 25rpx 0rpx;
}
</style>

View File

@ -0,0 +1,41 @@
<template>
<dom-echart :moduleParam="moduleParam1" :optionData="option"></dom-echart>
</template>
<script>
import domEchart from "@/components/echarts.vue";
export default {
//
components: {
domEchart,
},
data() {
return {
moduleParam1: {
id: "moId1",
height: "50vh",
width: "100%",
},
option: {
title: {
text: "销售",
},
tooltip: {},
legend: {
data: ["销量"],
},
xAxis: {
data: ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"],
},
yAxis: {},
series: [
{
name: "销量",
type: "bar",
data: [5, 20, 36, 10, 10, 20],
},
],
},
};
},
};
</script>

View File

@ -0,0 +1,45 @@
<template>
<LEchart class="echart" ref="chart" @finished="init" :customStyle="{height: height, 'z-index': 1}"></LEchart>
</template>
<script setup lang="ts">
import LEchart from "../../uni_modules/lime-echart/components/l-echart/l-echart.vue";
// import limeEchart from "../../uni_modules/lime-echart/components/lime-echart/lime-echart";
// #ifdef VUE3
// #ifdef MP
// vue3 使vite umd使使require
const echarts = require("../../uni_modules/lime-echart/static/echarts.min");
// #endif
// #ifndef MP
// vue3 使vite umdnpm
import * as echarts from "echarts";
// #endif
// #endif
let chart = ref(); // dom
const props = defineProps<{
option: object,
height: string
}>()
watchEffect(() => {
chart.value.init(echarts, (chart: any) => {
chart.setOption(props.option);
});
});
//
const init = () => {
console.log("渲染完成");
};
</script>
<style lang="scss" scoped>
.echart {
width: 100%;
height: 100%;
}
.title {
text-align: center;
}
</style>

View File

@ -0,0 +1,107 @@
<!--
tips:属性1.moduleParam:传id 以及宽高的对象 2.optionData:传渲染数据
-->
<template>
<view class="content">
<!-- #ifdef APP-PLUS || H5 -->
<view
@click="echarts.onClick"
:style="{ width: moduleParam.width, height: moduleParam.height }"
:prop="optionData"
:moduleParamProp="moduleParam"
:change:moduleParamProp="echarts.moduleParamUp"
:change:prop="echarts.updateEcharts"
:id="moduleParam.id"
class="echarts"
></view>
<!-- #endif -->
<!-- #ifndef APP-PLUS || H5 -->
<view> APPH5 环境不支持</view>
<!-- #endif -->
</view>
</template>
<script>
export default {
data() {
return {};
},
props: {
moduleParam: {
type: Object,
default: () => {
return {
id: "myCharts",
width: "100%",
height: "374rpx",
};
},
},
optionData: {
type: Object,
default: () => {},
},
},
methods: {
onViewClick(options) {
this.$emit("getClickData", options);
},
},
};
</script>
<script module="echarts" lang="renderjs">
let myChart
export default {
data() {
return {
clickData: null
}
},
mounted() {
if (typeof window.echarts === 'function') {
this.initEcharts()
} else {
//
const script = document.createElement('script')
// view www www
script.src = 'static/js/echarts.min.js'
script.onload = this.initEcharts.bind(this)
document.head.appendChild(script)
}
},
methods: {
initEcharts() {
myChart = echarts.init(document.getElementById(this.moduleParam.id), "echartsConfig")
// view 访
myChart.setOption(this.optionData)
//
myChart.on('click', params => {
this.clickData = params
})
},
updateEcharts(newValue, oldValue, ownerInstance, instance) {
// service
try {
myChart = echarts.init(document.getElementById(this.moduleParam.id), "echartsConfig")
myChart.setOption(newValue)
} catch (error) {}
},
moduleParamUp(newvalue, oldvalue) {},
onClick(event, ownerInstance) {
ownerInstance.callMethod('onViewClick', {
value: this.clickData.value,
name: this.clickData.name,
dataIndex: this.clickData.dataIndex,
seriesName: this.clickData.seriesName
})
}
}
}
</script>
<style scoped>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
</style>

View File

@ -0,0 +1,70 @@
<template>
<u-modal :show="show" >
<view class="slot-content">
<view class="title"> {{ title }} </view>
<view class="content">
<text :class="{ isMain: isMain }">{{ content }}</text>
</view>
</view>
<template #confirmButton>
<view class="btn-box">
<text class="cancel" @click="handleClose(false)">取消</text>
<text class="ok" @click="handleClose(false)">{{ okText }}</text>
</view>
</template>
</u-modal>
</template>
<script setup lang="ts">
const props = withDefaults(
defineProps<{
title: string;
content: string;
okText: string;
isMain: boolean;
show: boolean;
}>(),
{
okText: "确认",
isMain: false,
show: false
}
);
const emit = defineEmits(["handleModal"]);
const handleClose = () => {
emit("handleModal", false);
};
</script>
<style lang="scss" scoped>
.title {
text-align: center;
font-weight: 400;
font-size: 32rpx;
color: #000000;
margin-top: 25px;
}
.content {
padding-top: 25px;
font-weight: 400;
font-size: 27rpx;
color: #999999;
}
.isMain {
color: #ec0f3e;
}
.btn-box {
display: flex;
justify-content: space-between;
margin-bottom: 25px;
.cancel {
font-weight: 500;
font-size: 32rpx;
color: #999999;
}
.ok {
font-weight: 500;
font-size: 32rpx;
color: #00dcee;
}
}
</style>

View File

@ -0,0 +1,77 @@
<template>
<view
:style="{
paddingTop: navbarRect.top + 'px',
height: navbarRect.height + 'px',
}"
class="navbar"
>
<view class="left" @click="handleMsg()">
<view class="msg-badge">
<up-badge max="99" :value="'99'"></up-badge>
</view>
<up-image
src="/static/img/message.png"
width="42rpx"
height="36rpx"
></up-image>
</view>
<view class="title">工作台</view>
</view>
</template>
<script setup lang="ts">
const navbarRect = reactive({
height: 32,
top: 28,
msgCount: 10,
});
onMounted(() => {
// #ifdef APP-PLUS || MP-WEIXIN
let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
navbarRect.height = menuButtonInfo.height;
navbarRect.top = menuButtonInfo.top;
// #endif
});
const handleMsg = () => {
uni.navigateTo({
url: "/pages/message/index", //
});
};
</script>
<style lang="scss">
.navbar {
background: #f9f9f9;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.18);
padding: 15rpx;
position: fixed;
width: 100%;
top: 0;
left: 0;
right: 0;
z-index: 999;
.left {
position: absolute;
margin-top: 10px;
.msg-badge {
margin-left: 20rpx;
font-size: 16rpx;
padding: 2px 4px;
position: absolute;
z-index: 9;
margin-top: -10px;
}
}
.title {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #000000;
line-height: 41rpx;
text-align: center;
padding: 5px;
}
}
</style>

View File

@ -0,0 +1,69 @@
<template>
<view
:style="{
paddingTop: navbarRect.top + 'px',
height: navbarRect.height + 'px',
}"
class="navbar"
>
<view class="left" @click="handleMsg()">
</view>
<view class="title">个人中心</view>
</view>
</template>
<script setup lang="ts">
const navbarRect = reactive({
height: 32,
top: 28,
msgCount: 10,
});
onMounted(() => {
// #ifdef APP-PLUS || MP-WEIXIN
let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
navbarRect.height = menuButtonInfo.height;
navbarRect.top = menuButtonInfo.top;
// #endif
});
const handleMsg = () => {
uni.navigateTo({
url: "/pages/message/index", //
});
};
</script>
<style lang="scss">
.navbar {
background: #f9f9f9;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.18);
padding: 15rpx;
position: fixed;
width: 100%;
top: 0;
left: 0;
right: 0;
z-index: 999;
.left {
position: absolute;
margin-top: 10px;
.msg-badge {
margin-left: 20rpx;
font-size: 16rpx;
padding: 2px 4px;
position: absolute;
z-index: 9;
margin-top: -10px;
}
}
.title {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #000000;
line-height: 41rpx;
text-align: center;
padding: 5px;
}
}
</style>

View File

@ -0,0 +1,52 @@
<template>
<view class="search">
<view v-if="!isShowSearch" @click="isShowSearch = true">
<u-icon color="#C1C1C1" name="search"></u-icon
><text>{{ name }}</text>
</view>
<u-search
v-else
:placeholder="`请输入${name}`"
v-model="keyword"
:focus="true"
bgColor="#fff"
:clearabled="true"
:showAction="false"
placeholderColor="#C1C1C1"
></u-search>
</view>
</template>
<script setup lang="ts">
const isShowSearch = ref(false);
const keyword = ref();
const props = withDefaults(
defineProps<{
name: string;
}>(),
{
name: '搜索内容',
}
);
</script>
<style lang="scss" scoped>
.search {
box-shadow: 0rpx 3rpx 16rpx 5rpx rgba(0, 0, 0, 0.2);
border-radius: 28rpx;
background: rgba(255, 255, 255, 0.86);
width: 80%;
margin: 0px auto;
margin-top: 30rpx;
font-weight: 400;
font-size: 27rpx;
color: #c1c1c1;
> view {
line-height: 60rpx;
text-align: center;
display: flex;
justify-content: center;
}
text {
margin-left: 15rpx;
}
}
</style>

View File

@ -0,0 +1,51 @@
<template>
<view class="box">
<up-row>
<up-col v-for="(item, index) in list" :span="12 / list.length">
<view class="inner-box" :style="{ border: index === 0 ? 'none' : '' }">
<view class="num">{{ item.num }}</view>
<view>{{ item.name }}</view>
</view>
</up-col>
</up-row>
</view>
</template>
<script setup lang="ts">
const props = withDefaults(
defineProps<{
list: Array;
}>(),
{
list: [],
}
);
</script>
<style lang="scss" scoped>
.box {
padding: 19.23rpx;
// display: flex;
// justify-content: space-between;
align-items: center;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 24rpx;
color: #000000;
text-align: center;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
}
.inner-box {
text-align: center;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
border-left: 1px solid #e9e9e9;
.num {
font-weight: bold;
font-size: 27rpx;
}
}
</style>

View File

@ -0,0 +1,18 @@
<template>
<view class="title">
{{ props.title }}
</view>
</template>
<script setup lang="ts">
const props = defineProps<{
title:string
}>()
</script>
<style lang="scss">
.title {
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 27rpx;
color: #000000;
}
</style>

21
src/config/env.ts Normal file
View File

@ -0,0 +1,21 @@
// 不同的环境变量配置
const development = {
VITE_APP_BASE_URL: 'http://47.100.31.83:8081',
appid: '',
}
const test = {
VITE_APP_BASE_URL: 'http://47.100.31.83:8081',
appid: 'wxd5xxxxee0fce1c81',
}
const production = {
VITE_APP_BASE_URL: 'http://124.70.167.140:8081',
appid: 'wx3xxxx1ce403cab3',
}
export default {
development,
test,
production
}

25
src/env.d.ts vendored Normal file
View File

@ -0,0 +1,25 @@
/// <reference types="vite/client" />
// declare module '*.vue' {
// import { DefineComponent } from 'vue'
// // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
// const component: DefineComponent<{}, {}, any>
// export default component
// }
declare module "*.vue" {
import { ComponentOptions } from "vue";
const componentOptions: ComponentOptions;
export default componentOptions;
}
interface ImportMetaEnv extends Readonly<Record<string, string>> {
readonly VITE_APP_TITLE: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}

33
src/main.ts Normal file
View File

@ -0,0 +1,33 @@
import { createSSRApp } from "vue";
import uviewPlus from "uview-plus";
import pinia from './store'
import App from "./App.vue";
import './static/style/common.scss'
export function createApp() {
const app = createSSRApp(App);
app.use(uviewPlus);
app.use(pinia);
uni.$u.setConfig({
// 修改$u.config对象的属性
config: {
// 修改默认单位为rpx相当于执行 uni.$u.config.unit = 'rpx'
unit: 'px'
},
// 修改$u.props对象的属性
props: {
// 修改radio组件的size参数的默认值相当于执行 uni.$u.props.radio.size = 30
// checkbox: {
// size: 15
// }
// 其他组件属性配置
// ......
}
})
return {
app,
pinia
};
}

80
src/manifest.json Normal file
View File

@ -0,0 +1,80 @@
{
"name": "",
// DCloud ios
"appid": "",
"description": "",
"versionName": "1.0.0",
"versionCode": "100",
"transformPx": false,
/* 5+App */
"app-plus": {
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
/* */
"modules": {},
/* */
"distribute": {
/* android */
"android": {
"permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios": {},
/* SDK */
"sdkConfigs": {}
}
},
/* */
"quickapp": {},
// h5
"h5": {
"router": {
"base": "./"
}
},
/* */
"mp-weixin": {
"appid": "wx9251d74fe0e87028",
"setting": {
"urlCheck": false
},
"usingComponents": true
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics": {
"enable": false
},
"vueVersion": "3"
}

286
src/pages.json Normal file
View File

@ -0,0 +1,286 @@
{
"easycom": {
"autoscan": true,
// customhttps://ask.dcloud.net.cn/question/131175
"custom": {
"^u--(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^up-(.*)": "uview-plus/components/u-$1/u-$1.vue",
"^u-([^-].*)": "uview-plus/components/u-$1/u-$1.vue",
// ava
"^Ava(.*)": "@/components/Ava$1/Ava$1.vue",
"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
}
},
"pages": [
{
"path": "pages/index/index",
"style": {
"navigationStyle": "custom", //
"navigationBarTitleText": "工作台"
}
},
{
"path": "pages/launch/index",
"style": {
"navigationBarTitleText": ""
}
},
// {
// "path": "pages/index/index",
// "style": {
// "navigationStyle": "custom", //
// "navigationBarTitleText": "工作台"
// }
// },
{
"path": "pages/index/pricing",
"style": {
"navigationBarTitleText": "待定价"
}
},
{
"path": "pages/index/tareing",
"style": {
"navigationBarTitleText": "待过皮重"
}
},
{
"path": "pages/index/payReview",
"style": {
"navigationBarTitleText": "付款审核"
}
},
{
"path": "pages/index/paying",
"style": {
"navigationBarTitleText": "待支付"
}
},
{
"path": "pages/index/shipmenting",
"style": {
"navigationBarTitleText": "待出货"
}
},
{
"path": "pages/index/grossWeight",
"style": {
"navigationBarTitleText": "待过毛重"
}
},
{
"path": "pages/index/shipmentSettlement",
"style": {
"navigationBarTitleText": "出货结算"
}
},
{
"path": "pages/index/settlement",
"style": {
"navigationBarTitleText": "待结算"
}
},
{
"path": "pages/login/index",
"style": {
"navigationBarTitleText": "登陆"
}
},
{
"path": "pages/login/forgetPwd",
"style": {
"navigationBarTitleText": "忘记密码"
}
},
{
"path": "pages/message/index",
"style": {
"navigationBarTitleText": "消息中心"
}
},
{
"path": "pages/profile/index",
"style": {
"navigationBarTitleText": "个人中心"
}
},
{
"path": "pages/profile/baseinfo",
"style": {
"navigationBarTitleText": "基础信息",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/profile/modifyPwd",
"style": {
"navigationBarTitleText": "修改密码",
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path": "pages/statistics/index",
"style": {
"navigationBarTitleText": "数据统计"
}
},
{
"path": "pages/statistics/receivePanel",
"style": {
"navigationBarTitleText": "收货汇总"
}
},
{
"path": "pages/statistics/supplierRanking",
"style": {
"navigationBarTitleText": "供应商排行"
}
},
{
"path": "pages/statistics/shipmentPanel",
"style": {
"navigationBarTitleText": "出货汇总"
}
},
{
"path": "pages/statistics/customerRanking",
"style": {
"navigationBarTitleText": "客户排行"
}
},
{
"path": "pages/statistics/businessOverview",
"style": {
"navigationBarTitleText": "经营概况"
}
},
{
"path": "pages/statistics/supplierChecking",
"style": {
"navigationBarTitleText": "供应商对账"
}
},
{
"path": "pages/statistics/customerChecking",
"style": {
"navigationBarTitleText": "客户对账"
}
},
{
"path": "pages/scenePhoto/index",
"style": {
"navigationBarTitleText": "现场照片"
}
},
{
"path": "pages/statistics/supplier/billDetail",
"style": {
"navigationBarTitleText": "供应商账单详情"
}
},
{
"path": "pages/statistics/supplier/detail",
"style": {
"navigationBarTitleText": "供应商详情"
}
},
{
"path": "pages/statistics/customer/billDetail",
"style": {
"navigationBarTitleText": "客户账单详情"
}
},
{
"path": "pages/statistics/customer/detail",
"style": {
"navigationBarTitleText": "客户详情"
}
},
{
"path": "pages/app/receiveSpl",
"style": {
"navigationBarTitleText": "收货补单"
}
},
{
"path": "pages/app/shipmentSpl",
"style": {
"navigationBarTitleText": "出货补单"
}
},
{
"path": "pages/app/receiveDetail",
"style": {
"navigationBarTitleText": "收货明细"
}
},
{
"path": "pages/app/shipmentDetail",
"style": {
"navigationBarTitleText": "出货明细"
}
},
{
"path": "pages/app/receiveCl",
"style": {
"navigationBarTitleText": "收货作废"
}
},
{
"path": "pages/app/shipmentCl",
"style": {
"navigationBarTitleText": "出货作废"
}
},
{
"path": "pages/app/supplierMgt",
"style": {
"navigationBarTitleText": "供应商管理"
}
},
{
"path": "pages/app/customerMgt",
"style": {
"navigationBarTitleText": "客户管理"
}
},
//pageshttps://uniapp.dcloud.io/collocation/pages
// {
// "path": "pages/login/index",
// "style": {
// "navigationBarTitleText": "登陆注册",
// "navigationBarBackgroundColor": "#FFF"
// }
// },
// {
// "path": "pages/formItem/index",
// "style": {
// "navigationBarTitleText": "form 测试",
// "navigationBarBackgroundColor": "#FFF"
// }
// }
],
// "tabBar": {
// // "selectedColor": "#ff7d59",
// "list": [{
// "pagePath": "pages/index/index",
// "text": "首页",
// "iconPath": "",
// "selectedIconPath": ""
// },
// {
// "pagePath": "pages/login/index",
// "text": "登陆",
// "iconPath": "",
// "selectedIconPath": ""
// }]
// },
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "智能回收",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}

View File

@ -0,0 +1,81 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入客户名称"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
<view class="btn"> 新增 </view>
</view>
<view class="box">
<view v-for="item in 10" :key="item">
<view>
<view>客户名称</view>
<view>联系人张三</view>
<view>卡号235466566</view>
</view>
<view class="btn"> 删除 </view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.search {
display: flex;
align-items: center;
justify-content: space-between;
.btn {
background: #00dcee;
border-radius: 24rpx;
border: 1px solid #00dcee;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
margin-left: 50rpx;
padding: 6rpx 30rpx;
}
}
.box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 10rpx 25rpx;
font-weight: 400;
font-size: 22rpx;
color: #000000;
line-height: 41rpx;
margin-top: 30rpx;
> view {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 0rpx;
.btn {
background: #ff9d55;
border-radius: 24rpx;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
padding: 6rpx 30rpx;
}
.btn_text {
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
}
</style>

190
src/pages/app/receiveCl.vue Normal file
View File

@ -0,0 +1,190 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入供应商名称"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
</view>
<view class="box" v-for="item in 10" :key="item">
<view class="base">
<view>
<view class="no"> 收货单号SHD20230901132333 </view>
<view class="supplier"> 上海奉贤两网融合大磅 </view>
</view>
<view>
<text class="btn" @click="handleScenePhoto">现场照片</text>
</view>
</view>
<view class="name">吴小勇</view>
<view class="type">轻二</view>
<view class="flex-box">
<text>定价人谭兵</text>
<text>过磅时间2023-09-01 13:23:33</text>
</view>
<view class="more">
<view v-for="(item, index) in gridList1" :key="index" :style="item.isCustomStyle ? 'font-size: 22rpx;color:#999' : ''">
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
const gridList1 = reactive([
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "扣杂",
num: "640.00",
unit: "KG",
isBefore: false,
},
{},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "单价",
num: "2.48",
unit: "元/千克",
isBefore: false,
},
{
name: "结算总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "实际总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "作废人",
num: "谭兵",
unit: "",
isBefore: false,
isCustomStyle: true
},
{
name: "过皮",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.box {
margin-top: 30rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 30rpx;
.base {
display: flex;
align-items: center;
justify-content: space-between;
.no {
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
.supplier {
font-weight: 400;
font-size: 24rpx;
color: #000000;
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.name {
font-weight: 400;
font-size: 27rpx;
color: #000000;
margin: 15rpx 0rpx;
text {
background-color: #ffaf75;
font-weight: 500;
font-size: 16rpx;
color: #ffffff;
padding: 5rpx 20rpx;
margin-left: 20rpx;
}
}
.type {
font-weight: 400;
font-size: 27rpx;
color: #ec0f3e;
margin-bottom: 20rpx;
}
.flex-box {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 400;
font-size: 24rpx;
color: #999999;
border-bottom: 1rpx solid rgba(233, 233, 233, 0.76);
padding-bottom: 20rpx;
}
}
.more {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
font-weight: 400;
font-size: 24rpx;
color: #000000;
padding: 25rpx 0rpx 0rpx 0rpx;
> view {
line-height: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,243 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入收货单号"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
<view class="btn"> 创建 </view>
</view>
<view class="filter">
<view><text>本月</text><u-icon name="arrow-down"></u-icon></view>
<view><text>单据状态</text><u-icon name="arrow-down"></u-icon></view>
<view><text>排序</text><u-icon name="arrow-down"></u-icon></view>
<view class="btn">筛选</view>
</view>
<view class="time">2024-01-01</view>
<view class="box" v-for="item in 10" :key="item">
<view class="base">
<view>
<view class="no"> 收货单号SHD20230901132333 </view>
<view class="supplier"> 上海奉贤两网融合大磅 </view>
</view>
<view>
<text class="btn" @click="handleScenePhoto">现场照片</text>
</view>
</view>
<view class="name">吴小勇 <text>未审核</text></view>
<view class="type">轻二</view>
<view class="flex-box">
<text>定价人谭兵</text>
<text>创建时间2023-09-01 13:23:33</text>
</view>
<view class="more">
<view v-for="(item, index) in gridList1" :key="index" :style="item.isCustomStyle ? 'font-size: 22rpx;color:#999' : ''">
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
const gridList1 = reactive([
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "扣杂",
num: "640.00",
unit: "KG",
isBefore: false,
},
{},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "单价",
num: "2.48",
unit: "元/千克",
isBefore: false,
},
{
name: "结算总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "实际总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "过毛",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true
},
{
name: "过皮",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.search {
display: flex;
align-items: center;
justify-content: space-between;
.btn {
background: #00dcee;
border-radius: 24rpx;
border: 1px solid #00dcee;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
margin-left: 50rpx;
padding: 6rpx 30rpx;
}
}
.filter {
margin-top: 30rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 400;
font-size: 27rpx;
color: #000000;
> view {
display: inline-block;
display: flex;
align-items: center;
text {
margin-right: 10rpx;
}
}
.btn {
font-size: 27rpx;
color: #00dcee;
}
}
.time {
font-weight: 400;
font-size: 22rpx;
color: #000000;
margin: 30rpx 0rpx;
}
.box + .box {
margin-top: 30rpx;
}
.box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 30rpx;
.base {
display: flex;
align-items: center;
justify-content: space-between;
.no {
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
.supplier {
font-weight: 400;
font-size: 24rpx;
color: #000000;
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.name {
font-weight: 400;
font-size: 27rpx;
color: #000000;
margin: 15rpx 0rpx;
text {
background-color: #ffaf75;
font-weight: 500;
font-size: 16rpx;
color: #ffffff;
padding: 5rpx 20rpx;
margin-left: 20rpx;
}
}
.type {
font-weight: 400;
font-size: 27rpx;
color: #ec0f3e;
margin-bottom: 20rpx;
}
.flex-box {
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 400;
font-size: 24rpx;
color: #999999;
border-bottom: 1rpx solid rgba(233, 233, 233, 0.76);
padding-bottom: 20rpx;
}
}
.more {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
font-weight: 400;
font-size: 24rpx;
color: #000000;
padding: 25rpx 0rpx 0rpx 0rpx;
> view {
line-height: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,258 @@
<template>
<view class="c-card">
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="form"
:labelWidth="80"
:labelStyle="{ padding: '0rpx 10rpx' }"
>
<u-form-item
:prop="`order[${item.key}]`"
:label="item.name"
required
v-for="(item, index) in formAttrList"
:key="index"
@click="item.fn"
>
<u-textarea
v-if="item.type === 'textarea'"
v-model="(model1.order as any)[item.key]"
:placeholder="`请输入${item.name}`"
></u-textarea>
<u-input
v-if="item.type === 'select' || item.type === 'input'"
v-model="(model1.order as any)[item.key]"
:placeholder="`${item.type === 'select' ? '选择' : '输入'}${
item.name
}`"
:clearable="true"
:customStyle="{}"
border="none"
>
<template #suffix>
<text v-if="item.key === 'subtractNum'">
{{ model1.order.subtractType === 1 ? item.unit : "%" }}
</text>
<text v-else>
{{ item.unit }}
</text>
</template>
</u-input>
<!-- @afterRead="afterRead"
@delete="deletePic" -->
<u-upload
v-if="item.type === 'upload'"
:fileList="[]"
name="1"
multiple
:maxCount="10"
></u-upload>
<u-radio-group
v-if="item.type === 'radio'"
v-model="(model1.order as any)[item.key]"
placement="row"
>
<u-radio activeColor="#00DCEE" label="按固定重量" :name="1"></u-radio>
&nbsp;&nbsp;&nbsp;
<u-radio activeColor="#00DCEE" label="按百分比" :name="2"></u-radio>
</u-radio-group>
<template #right v-if="item.type === 'select'">
<u-icon name="arrow-right"></u-icon>
</template>
</u-form-item>
</u-form>
<u-datetime-picker
:show="contrlModalParams.isShowSplTime"
v-model="contrlModalParams.spltime"
mode="datetime"
@confirm="contrlModalParams.isShowSplTime = false"
@cancel="contrlModalParams.isShowSplTime = false"
></u-datetime-picker>
<u-action-sheet
:actions="contrlModalParams.select.selectList"
:title="contrlModalParams.select.title"
:show="contrlModalParams.select.isShow"
@select="contrlModalParams.select.isShow = false"
@close="contrlModalParams.select.isShow = false"
></u-action-sheet>
</view>
<view class="btn-box">
<u-button type="primary" text="保存"></u-button>
</view>
</template>
<script setup lang="ts">
const model1 = reactive({
order: {
splTime: "",
subtractType: 1,
},
});
const rules = ref({
"userInfo.userName": {
type: "string",
required: true,
message: "请输入手机号",
trigger: ["blur", "change"],
},
"userInfo.password": {
type: "string",
required: true,
message: "请输入密码",
trigger: ["blur", "change"],
},
});
const contrlModalParams = reactive({
isShowSplTime: false,
spltime: "",
select: {
isShow: false,
title: "标题",
selectList: [
{
name: "选项一",
},
{
name: "选项二",
},
],
},
});
const formAttrList = reactive([
{
name: "补单时间",
key: "splTime",
type: "select",
unit: "",
fn: () => {
contrlModalParams.isShowSplTime = true;
},
},
{
name: "站点磅秤",
key: "stationScale",
type: "select",
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "站点磅秤";
},
},
{
name: "供应商",
key: "supplier",
type: "select",
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "供应商";
},
},
{
name: "车牌号",
key: "carNo",
type: "input",
unit: "",
},
{
name: "收货产品",
key: "receiveProduct",
type: "select",
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "收货产品";
},
},
{
name: "毛重",
key: "grossWeight",
type: "input",
unit: "KG",
},
{
name: "皮重",
key: "tare",
type: "input",
unit: "KG",
},
{
name: "扣杂",
key: "subtractType",
type: "radio",
},
{
name: "杂质扣除",
key: "subtractNum",
type: "input",
unit: "KG",
},
{
name: "净重",
key: "netWeight",
type: "input",
unit: "KG",
},
{
name: "单价",
key: "unitPrice",
type: "input",
unit: "元/KG",
},
{
name: "预估总价",
key: "estimatedTotalPrice",
type: "input",
unit: "元",
},
{
name: "贷款金额",
key: "loanAmount",
type: "input",
unit: "元",
},
{
name: "备注",
key: "remark",
type: "textarea",
},
{
name: "货品照片",
key: "photo",
type: "upload",
},
]);
</script>
<style lang="scss" scoped>
.c-card {
background: #ffffff;
// box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 30rpx 25rpx;
padding: 10rpx 20rpx;
::v-deep .u-form-item {
height: auto;
}
::v-deep .u-form-item + .u-form-item {
border-top: 1rpx solid rgba(233, 233, 233, 0.76);
}
}
.btn-box {
margin-top: 60rpx;
display: flex;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
padding: 25rpx 50rpx;
position: sticky;
bottom: 0rpx;
z-index: 999;
::v-deep button {
border-radius: 43rpx;
}
}
</style>

View File

@ -0,0 +1,242 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入供应商名称"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
</view>
<view class="box" v-for="item in 10" :key="item">
<view class="base">
<view>
<view class="no"> 出货单号SHD20230901132333 </view>
<view class="supplier"> 上海奉贤两网融合大磅 </view>
</view>
<view>
<text class="btn" @click="handleScenePhoto">现场照片</text>
</view>
</view>
<view class="name">吴小勇 <text>未结算</text></view>
<view class="type">轻二</view>
<view class="more">
<view
v-for="(item, index) in gridList1"
:key="index"
:style="{
width: `${item.name === '创建时间' ? 'max-content' : ''}`,
'font-size': `${item.isCustomStyle ? '22rpx' : ''}`,
color: `${item.isCustomStyle ? '#999' : ''}`,
}"
>
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
const gridList1 = reactive([
{
name: "卡号",
num: "123123",
},
{},
{
name: "创建时间",
num: "2023-09-01 13:23:33",
},
{},
{
name: "车牌号",
num: "123",
isBefore: false,
},
{
name: "送货方式",
num: "自提",
isBefore: false,
},
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "数量",
num: "1",
isBefore: false,
},
{
name: "过毛",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true,
},
{
name: "过皮",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true,
},
{
name: "结算重量",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "单价",
num: "2.48",
unit: "元/千克",
isBefore: false,
},
{
name: "结算总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "实结金额",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "应收金额",
num: "2.48",
unit: "元",
isBefore: false,
},
{},
{
name: "作废人",
num: "谭兵",
unit: "",
isBefore: false,
isCustomStyle: true,
},
{
name: "过皮",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true,
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.search {
display: flex;
align-items: center;
justify-content: space-between;
.btn {
background: #00dcee;
border-radius: 24rpx;
border: 1px solid #00dcee;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
margin-left: 50rpx;
padding: 6rpx 30rpx;
}
}
.box {
margin-top: 30rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 30rpx;
.base {
display: flex;
align-items: center;
justify-content: space-between;
.no {
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
.supplier {
font-weight: 400;
font-size: 24rpx;
color: #000000;
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.name {
font-weight: 400;
font-size: 27rpx;
color: #000000;
margin: 15rpx 0rpx;
text {
background-color: #ffaf75;
font-weight: 500;
font-size: 16rpx;
color: #ffffff;
padding: 5rpx 20rpx;
margin-left: 20rpx;
}
}
.type {
font-weight: 400;
font-size: 27rpx;
color: #ec0f3e;
margin-bottom: 20rpx;
}
}
.more {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
font-weight: 400;
font-size: 24rpx;
color: #000000;
> view {
line-height: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,263 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入出货单号"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
<view class="btn"> 创建 </view>
</view>
<view class="filter">
<view><text>本月</text><u-icon name="arrow-down"></u-icon></view>
<view><text>单据状态</text><u-icon name="arrow-down"></u-icon></view>
<view><text>排序</text><u-icon name="arrow-down"></u-icon></view>
<view class="btn">筛选</view>
</view>
<view class="time">2024-01-01</view>
<view class="box" v-for="item in 10" :key="item">
<view class="base">
<view>
<view class="no"> 出货单号SHD20230901132333 </view>
<view class="supplier"> 上海奉贤两网融合大磅 </view>
</view>
<view>
<text class="btn" @click="handleScenePhoto">现场照片</text>
</view>
</view>
<view class="name">吴小勇 <text>已结算</text></view>
<view class="type">轻二</view>
<view class="more">
<view
v-for="(item, index) in gridList1"
:key="index"
:style="{'width': `${item.name === '创建时间' ? 'max-content' : ''}`, 'font-size': `${item.isCustomStyle ? '22rpx': ''}`, 'color': `${item.isCustomStyle ? '#999': ''}`}"
>
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
const gridList1 = reactive([
{
name: "卡号",
num: "123123",
},
{},
{
name: "创建时间",
num: "2023-09-01 13:23:33",
},
{},
{
name: "车牌号",
num: "123",
isBefore: false,
},
{
name: "送货方式",
num: "自提",
isBefore: false,
},
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "数量",
num: "1",
isBefore: false,
},
{
name: "过毛",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true,
},
{
name: "过皮",
num: "2023-09-01 13:23:33",
unit: "",
isBefore: false,
isCustomStyle: true,
},
{
name: "结算重量",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "单价",
num: "2.48",
unit: "元/千克",
isBefore: false,
},
{
name: "结算总价",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "实际金额",
num: "2.48",
unit: "元",
isBefore: false,
},
{
name: "实收金额",
num: "2.48",
unit: "元",
isBefore: false,
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.search {
display: flex;
align-items: center;
justify-content: space-between;
.btn {
background: #00dcee;
border-radius: 24rpx;
border: 1px solid #00dcee;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
margin-left: 50rpx;
padding: 6rpx 30rpx;
}
}
.filter {
margin-top: 30rpx;
display: flex;
align-items: center;
justify-content: space-between;
font-weight: 400;
font-size: 27rpx;
color: #000000;
> view {
display: inline-block;
display: flex;
align-items: center;
text {
margin-right: 10rpx;
}
}
.btn {
font-size: 27rpx;
color: #00dcee;
}
}
.time {
font-weight: 400;
font-size: 22rpx;
color: #000000;
margin: 30rpx 0rpx;
}
.box + .box {
margin-top: 30rpx;
}
.box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 30rpx;
.base {
display: flex;
align-items: center;
justify-content: space-between;
.no {
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
.supplier {
font-weight: 400;
font-size: 24rpx;
color: #000000;
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.name {
font-weight: 400;
font-size: 27rpx;
color: #000000;
margin: 15rpx 0rpx;
text {
background-color: #ffaf75;
font-weight: 500;
font-size: 16rpx;
color: #ffffff;
padding: 5rpx 20rpx;
margin-left: 20rpx;
}
}
.type {
font-weight: 400;
font-size: 27rpx;
color: #ec0f3e;
margin-bottom: 20rpx;
}
}
.more {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
font-weight: 400;
font-size: 24rpx;
color: #000000;
> view {
line-height: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,274 @@
<template>
<view class="c-card">
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="form"
:labelWidth="80"
:labelStyle="{ padding: '0rpx 10rpx' }"
>
<u-form-item
:prop="`order[${item.key}]`"
:label="item.name"
:required="item.required"
v-for="(item, index) in formAttrList"
:key="index"
@click="item.fn"
>
<u-textarea
v-if="item.type === 'textarea'"
v-model="(model1.order as any)[item.key]"
:placeholder="`请输入${item.name}`"
></u-textarea>
<u-input
v-if="item.type === 'select' || item.type === 'input'"
v-model="(model1.order as any)[item.key]"
:placeholder="`${item.type === 'select' ? '选择' : '输入'}${
item.name
}`"
:clearable="true"
:customStyle="{}"
border="none"
>
<template #suffix>
<text v-if="item.key === 'subtractNum'">
{{ model1.order.subtractType === 1 ? item.unit : "%" }}
</text>
<text v-else>
{{ item.unit }}
</text>
</template>
</u-input>
<!-- @afterRead="afterRead"
@delete="deletePic" -->
<u-upload
v-if="item.type === 'upload'"
:fileList="[]"
name="1"
multiple
:maxCount="10"
></u-upload>
<u-radio-group
v-if="item.type === 'radio'"
v-model="(model1.order as any)[item.key]"
placement="row"
>
<u-radio activeColor="#00DCEE" label="送货" :name="1"></u-radio>
&nbsp;&nbsp;&nbsp;
<u-radio activeColor="#00DCEE" label="自提" :name="2"></u-radio>
</u-radio-group>
<template #right v-if="item.type === 'select'">
<u-icon name="arrow-right"></u-icon>
</template>
</u-form-item>
</u-form>
<u-datetime-picker
:show="contrlModalParams.isShowSplTime"
v-model="contrlModalParams.spltime"
mode="datetime"
@confirm="contrlModalParams.isShowSplTime = false"
@cancel="contrlModalParams.isShowSplTime = false"
></u-datetime-picker>
<u-action-sheet
:actions="contrlModalParams.select.selectList"
:title="contrlModalParams.select.title"
:show="contrlModalParams.select.isShow"
@select="contrlModalParams.select.isShow = false"
@close="contrlModalParams.select.isShow = false"
></u-action-sheet>
</view>
<view class="btn-box">
<u-button type="primary" text="保存"></u-button>
</view>
</template>
<script setup lang="ts">
const model1 = reactive({
order: {
splTime: "",
takeType: 1,
},
});
const rules = ref({
"userInfo.userName": {
type: "string",
required: true,
message: "请输入手机号",
trigger: ["blur", "change"],
},
"userInfo.password": {
type: "string",
required: true,
message: "请输入密码",
trigger: ["blur", "change"],
},
});
const contrlModalParams = reactive({
isShowSplTime: false,
spltime: "",
select: {
isShow: false,
title: "标题",
selectList: [
{
name: "选项一",
},
{
name: "选项二",
},
],
},
});
const formAttrList = reactive([
{
name: "补单时间",
key: "splTime",
type: "select",
required: true,
unit: "",
fn: () => {
contrlModalParams.isShowSplTime = true;
},
},
{
name: "过磅设备",
key: "weighDevice",
type: "select",
required: true,
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "站点磅秤";
},
},
{
name: "客户",
key: "customer",
type: "select",
required: true,
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "供应商";
},
},
{
name: "出货产品",
key: "shipmentProduct",
type: "select",
required: true,
unit: "",
fn: () => {
contrlModalParams.select.isShow = true;
contrlModalParams.select.title = "收货产品";
},
},
{
name: "数量",
key: "grossWeight",
type: "input",
required: true,
unit: "件",
},
{
name: "毛重",
key: "grossWeight",
type: "input",
required: true,
unit: "KG",
},
{
name: "皮重",
key: "tare",
type: "input",
required: true,
unit: "KG",
},
{
name: "净重",
key: "netWeight",
type: "input",
unit: "KG",
},
{
name: "提货方式",
key: "takeType",
required: true,
type: "radio",
},
{
name: "车辆信息",
type: "text",
},
{
name: "车牌号",
key: "carNo",
type: "input",
unit: "",
},
{
name: "司机电话",
key: "phone",
type: "input",
unit: "",
},
{
name: "集装箱",
type: "text",
},
{
name: "箱号",
key: "boxNo",
type: "input",
unit: "",
},
{
name: "封号",
key: "no",
type: "input",
unit: "",
},
{
name: "备注",
key: "remark",
type: "textarea",
},
{
name: "上传照片",
key: "photo",
type: "upload",
},
]);
</script>
<style lang="scss" scoped>
.c-card {
background: #ffffff;
// box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 30rpx 25rpx;
padding: 10rpx 20rpx;
::v-deep .u-form-item {
height: auto;
}
::v-deep .u-form-item + .u-form-item {
border-top: 1rpx solid rgba(233, 233, 233, 0.76);
}
}
.btn-box {
margin-top: 60rpx;
display: flex;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
padding: 25rpx 50rpx;
position: sticky;
bottom: 0rpx;
z-index: 999;
::v-deep button {
border-radius: 43rpx;
}
}
</style>

View File

@ -0,0 +1,84 @@
<template>
<view class="c-card">
<view class="search">
<u-search
placeholder="请输入供应商名称"
v-model="keyword"
:showAction="false"
:bgColor="'#fff'"
:borderColor="'rgba(0, 0, 0, 0.1)'"
:placeholderColor="'#C1C1C1'"
></u-search>
<view class="btn"> 新增 </view>
</view>
<view class="box">
<view>
<view>
<view>供应商名称</view>
<view>卡号235466566</view>
</view>
<view class="btn"> 删除 </view>
</view>
<view>
<view> 送货员111 </view>
<view class="btn_text"> 详情 </view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const keyword = ref("");
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
.search {
display: flex;
align-items: center;
justify-content: space-between;
.btn {
background: #00dcee;
border-radius: 24rpx;
border: 1px solid #00dcee;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
margin-left: 50rpx;
padding: 6rpx 30rpx;
}
}
.box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 10rpx 25rpx;
font-weight: 400;
font-size: 22rpx;
color: #000000;
line-height: 41rpx;
margin-top: 30rpx;
> view {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20rpx 0rpx;
.btn {
background: #ff9d55;
border-radius: 24rpx;
font-weight: 500;
font-size: 24rpx;
color: #ffffff;
padding: 6rpx 30rpx;
}
.btn_text {
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
}
</style>

View File

@ -0,0 +1,121 @@
<template>
<view class="c-login-container">
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="loginForm"
:labelWidth="0"
>
<u-form-item prop="userInfo.name" borderBottom ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请输入手机号"
:shape="'circle'"
></u-input>
</u-form-item>
<u-form-item prop="userInfo.name" borderBottom ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请输入验证码"
:shape="'circle'"
>
<template #suffix>
<text>获取验证码</text>
</template>
</u-input>
</u-form-item>
<u-form-item prop="userInfo.name" borderBottom ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请设置密码"
:shape="'circle'"
:type="'password'"
></u-input>
</u-form-item>
<u-form-item>
<view class="c-flex-space-between">
<u-checkbox-group
v-model="checkboxValue1"
placement="column"
@change="checkboxChange"
>
<u-checkbox
:customStyle="{ fontSize: '8px' }"
:key="'1'"
:label="'记住密码'"
:name="'记住密码'"
/>
</u-checkbox-group>
<text class="f-s-15 l-h-28">无法收到验证码</text>
</view>
</u-form-item>
<u-form-item>
<view class="c-flex-space-between">
<view style="display: flex; line-height: 28px">
<view>
<u-checkbox-group
v-model="checkboxValue1"
placement="column"
@change="checkboxChange"
>
<u-checkbox :customStyle="{ fontSize: '8px' }" :key="'1'" />
</u-checkbox-group>
</view>
<view>
同意用户<a href="#">服务协议</a><a href="#">隐私政策</a>
</view>
</view>
<text class="f-s-15 l-h-28">忘记密码</text>
</view>
</u-form-item>
</u-form>
<u-button @click="submit">立即登录</u-button>
</view>
</template>
<script setup lang="ts">
const loginForm = ref(null);
const checkboxValue1 = ref([]);
const model1 = ref({
userInfo: {
name: "",
sex: "",
},
});
const rules = ref({
"userInfo.name": {
type: "string",
required: true,
message: "请填写姓名",
trigger: ["blur", "change"],
},
"userInfo.sex": {
type: "string",
max: 1,
required: true,
message: "请选择男或女",
trigger: ["blur", "change"],
},
});
const checkboxChange = (n: any) => {
console.log("change", n);
};
const submit = () => {
(loginForm.value as any).validate();
};
</script>
<style lang="scss" scoped>
.c-login-container {
padding: 30px;
}
.c-flex-space-between {
display: flex;
justify-content: space-between;
width: 100%;
font-size: 12px;
}
</style>

View File

@ -0,0 +1,99 @@
<template>
<view class="card-box">
<view class="top-flex-box">
<view>
<view>
<text class="address">上海奉贤两网融合</text>
<text class="type">(大磅)</text>
</view>
<view>
<text class="number">收货单号SHD20230901132333</text>
</view>
<view>
<text class="name">陡其成</text>
</view>
</view>
<view>
<text class="btn">现场照片</text>
</view>
</view>
<view>
<text class="desc">毛重时间2023-09-01 13:23:33</text>
</view>
<view class="flex-box">
<text>皮重2510kg</text>
</view>
<view class="btn-box">
<u-button
text="点击作废"
color="#E8E8E8"
:customStyle="{ color: '#999' }"
></u-button>
<u-button type="primary" text="点击编辑"></u-button>
</view>
</view>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped>
.card-box {
padding: 38rpx 50rpx;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 0rpx 25rpx;
margin-top: 35rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
.top-flex-box {
display: flex;
justify-content: space-between;
align-items: center;
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.address {
margin-right: 30rpx;
}
.type,
.desc {
font-size: 21rpx;
color: #999999;
}
.desc {
margin-top: 30rpx;
display: inline-block;
}
.name {
font-size: 32rpx;
color: #000000;
}
.flex-box {
font-weight: 400;
font-size: 32rpx;
color: #000000;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.btn-box {
margin-top: 60rpx;
display: flex;
::v-deep button {
border-radius: 43rpx;
}
::v-deep button + button {
margin-left: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,73 @@
<template>
123
<view class="launch-start">
<AvaSwiper :list="bannerDate"></AvaSwiper>
<swiper indicator-dots autoplay circular class="c-swiper-container">
<swiper-item v-for="(item, index) in list" :key="index">
<view class="c-text-center">
<image mode="widthFix" :src="item.url" @tap="onPreviewImage(item.url)"/>
</view>
<view class="desc">
<text>{{ item.title }}</text>
</view>
</swiper-item>
</swiper>
</view>
</template>
<script setup lang="ts">
import type { BannerItem } from '@/types/home';
const bannerDate = ref<BannerItem[]>([
{
id: 1,
herfUrl: '',
imgUrl: "https://cdn.uviewui.com/uview/swiper/swiper1.png",
},
{
id: 2,
herfUrl: '',
imgUrl: "https://cdn.uviewui.com/uview/swiper/swiper2.png",
}
])
const list = ref([
{
url: "https://cdn.uviewui.com/uview/swiper/swiper1.png",
title: "智能回收,智慧未来!",
},
{
url: "https://cdn.uviewui.com/uview/swiper/swiper2.png",
title: "高效管理,安全快捷!",
},
{
url: "https://cdn.uviewui.com/uview/swiper/swiper1.png",
title: "全新系统,崭新界面!",
},
{
url: "https://cdn.uviewui.com/uview/swiper/swiper3.png",
title: "全城握手,致富从这里开始",
},
]);
const onPreviewImage = (url: string) => {
uni.previewImage({
current: url,
urls: list.value.map(v=>v.url),
})
}
</script>
<style lang="scss" scoped>
.launch-start {
height: 100vh;
padding: 40px;
.c-swiper-container {
height: calc(100% - 100px);
}
.desc {
text-align: center;
position: absolute;
width: 100%;
bottom: 100px;
}
}
</style>

590
src/pages/index/index.vue Normal file
View File

@ -0,0 +1,590 @@
<template>
<!-- 自定义工作台头部 -->
<NavBar></NavBar>
<view
class="contaner"
:style="{
marginTop: navbarRect.height + navbarRect.top + 'px',
height: navbarRect.safeHeight + 'px',
}"
>
<!-- 数据汇总面板 -->
<!-- `url('/static/img/${item.imgUrl}')`, -->
<view class="summary">
<!-- :style="{
'background': 'url(\'/static/img/'+ item.imgUrl +'\')',
backgroundSize: 'cover',
}" -->
<view class="panel" v-for="(item, index) in summaryList" :key="index">
<image :src="`/static/img/${item.imgUrl}`" />
<view class="box">
<view class="num">{{ item.num }}</view>
<view class="title">{{ item.title }}</view>
</view>
</view>
</view>
<view class="data-detail">
<view class="p-15">
<!-- 收货入库 -->
<text class="title">收货入库</text>
<view class="data-receive">
<up-row justify="center" gutter="10">
<up-col span="3" v-for="(item, index) in receiveList" :key="index" @click="(item as any).fn()">
<view
class="box"
:style="{
backgroundColor: boxStyleList[index].backgroundColor,
borderColor: boxStyleList[index].borderColor,
boxShadow: `0rpx 7rpx 12rpx 0rpx ${boxStyleList[index].shadowColor}`,
}"
>
<view
class="num"
:style="{ color: boxStyleList[index].numColor }"
>
<text>{{ item.num }}</text>
</view>
<view class="desc">
<text>{{ item.title }}</text>
</view>
</view>
</up-col>
</up-row>
</view>
<!-- 出货入库 -->
<text class="title title-shipment">出货入库</text>
<view class="data-shipment">
<up-row justify="center" gutter="10">
<up-col span="3" v-for="(item, index) in shipmentList" :key="index" @click="(item as any).fn()">
<view
class="box"
:style="{
backgroundColor: boxStyleList[index].backgroundColor,
borderColor: boxStyleList[index].borderColor,
boxShadow: `0rpx 7rpx 12rpx 0rpx ${boxStyleList[index].shadowColor}`,
}"
>
<view
class="num"
:style="{ color: boxStyleList[index].numColor }"
>
<text>{{ item.num }}</text>
</view>
<view class="desc">
<text>{{ item.title }}</text>
</view>
</view>
</up-col>
</up-row>
</view>
</view>
<!-- 线条 -->
<view class="line"> </view>
<!-- 常用应用 -->
<view class="app-list">
<view class="name">常用应用</view>
<u-grid :border="false" col="4">
<u-grid-item v-for="(item, listIndex) in appList" :key="listIndex" @click="item.fn">
<up-image
:src="`/static/img/${item.icon}`"
width="40rpx"
height="40rpx"
></up-image>
<text class="grid-text">{{ item.title }}</text>
</u-grid-item>
</u-grid>
</view>
</view>
</view>
<!-- 工作台底部菜单 -->
<view>
<view class="tabBar">
<view class="tabMenuBox">
<view class="circle-box"></view>
<u-grid :border="false">
<u-grid-item
v-for="(item, listIndex) in tabMenuList"
:key="listIndex"
@click="item.fn"
>
<up-image
:src="`/static/img/TabMenu/${item.icon}`"
width="33rpx"
height="40rpx"
mode="aspectFill"
class="grid-icon"
></up-image>
<text
class="grid-text"
:style="{ color: listIndex === 1 ? '#fff' : '' }"
>{{ item.title }}</text
>
</u-grid-item>
</u-grid>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { useMemberStore } from "@/store/index";
import { ReceiveApi, ShipmentApi } from "@/services/index";
const store = useMemberStore();
const navbarRect = reactive({
height: 32,
top: 28,
safeHeight: 500,
});
const getSafeHeight = () => {
// #ifdef APP-PLUS || MP-WEIXIN
uni.getSystemInfo({
success: (res) => {
navbarRect.safeHeight =
res.windowHeight -
uni.upx2px(80) -
navbarRect.height -
navbarRect.top -
40 -
17;
},
});
// #endif
};
const summaryList = reactive([
{
title: "总收货/KG",
num: 0,
imgUrl: "01.png",
},
{
title: "收货总支出/元",
num: 0,
imgUrl: "02.png",
},
{
title: "总出货/KG",
num: 0,
imgUrl: "03.png",
},
{
title: "出货总收入/元",
num: 0,
imgUrl: "04.png",
},
]);
const boxStyleList = reactive([
{
borderColor: "rgba(240, 147, 107, 1)",
backgroundColor: "#FFFAF7",
shadowColor: "rgba(146,44,0,0.2)",
numColor: "rgba(240, 145, 105, 1)",
},
{
borderColor: "rgba(218, 193, 88, 1)",
backgroundColor: "#FFFEF7",
shadowColor: "rgba(138,111,0,0.2)",
numColor: "rgba(217, 193, 88, 1)",
},
{
borderColor: "rgba(88, 173, 232, 1)",
backgroundColor: "#F7FCFF",
shadowColor: "rgba(8, 82, 92, 0.20)",
numColor: "rgba(88, 173, 232, 1)",
},
{
borderColor: "rgba(82, 210, 207, 1)",
backgroundColor: "#F7FFFF",
shadowColor: "rgba(0, 106, 103, 0.20)",
numColor: "rgba(84, 212, 208, 1)",
},
]);
const receiveList = reactive([
{
title: "待定价",
num: 0,
fn: () => {
uni.navigateTo({
url: "/pages/index/pricing", //
});
},
},
{
title: "待过皮重",
num: 0,
fn: () => {
uni.navigateTo({
url: "/pages/index/tareing", //
});
},
},
{
title: "付款审核",
num: 0,
fn: () => {
uni.navigateTo({
url: "/pages/index/payReview", //
});
},
},
{
title: "待支付",
num: 0,
fn: () => {
uni.navigateTo({
url: "/pages/index/payReview", //
});
},
},
]);
const shipmentList = reactive([
{
title: "待出货",
num: 999,
fn: () => {
uni.navigateTo({
url: "/pages/index/shipmenting", //
});
},
},
{
title: "待过毛重",
num: 999,
fn: () => {
uni.navigateTo({
url: "/pages/index/grossWeight", //
});
},
},
{
title: "出货结算",
num: 999,
fn: () => {
uni.navigateTo({
url: "/pages/index/payReview", //
});
},
},
{
title: "待结算",
num: 999,
fn: () => {
uni.navigateTo({
url: "/pages/index/payReview", //
});
},
},
]);
const appList = reactive([
{
icon: "app1.png",
title: "收货补单",
fn: () => {
uni.navigateTo({
url: "/pages/app/receiveSpl", //
});
},
},
{
icon: "app2.png",
title: "出货补单",
fn: () => {
uni.navigateTo({
url: "/pages/app/shipmentSpl", //
});
},
},
{
icon: "app4.png",
title: "收货明细",
fn: () => {
uni.navigateTo({
url: "/pages/app/receiveDetail", //
});
},
},
{
icon: "app3.png",
title: "出货明细",
fn: () => {
uni.navigateTo({
url: "/pages/app/shipmentDetail", //
});
},
},
{
icon: "app5.png",
title: "收货作废",
fn: () => {
uni.navigateTo({
url: "/pages/app/receiveCl", //
});
},
},
{
icon: "app6.png",
title: "出货作废",
fn: () => {
uni.navigateTo({
url: "/pages/app/shipmentCl", //
});
},
},
{
icon: "app7.png",
title: "供应商管理",
fn: () => {
uni.navigateTo({
url: "/pages/app/supplierMgt", //
});
},
},
{
icon: "app8.png",
title: "客户管理",
fn: () => {
uni.navigateTo({
url: "/pages/app/customerMgt", //
});
},
},
]);
const tabMenuList = reactive([
{
icon: "statistics.png",
title: "统计",
fn: () => {
uni.navigateTo({
url: "/pages/statistics/index", //
});
},
},
{
icon: "home.png",
title: "工作台",
},
{
icon: "profile.png",
title: "我的",
fn: () => {
uni.navigateTo({
url: "/pages/profile/index", //
});
},
},
]);
//
ReceiveApi.countOrderByMonth().then((res) => {
if(res.code === 200) {
const {totalReceipt, totalExpenditure, toBePriced, toBeTare, audit, toBePaid} = res.data
summaryList[0].num = totalReceipt
summaryList[1].num = totalExpenditure
receiveList[0].num = toBePriced
receiveList[1].num = toBeTare
receiveList[2].num = audit
receiveList[3].num = toBePaid
}
});
//
ShipmentApi.countOrderByMonth().then((res) => {
if(res.code === 200) {
const {totalShipment, totalIncome, toBeShipped, roughWeight, shipmentReview, toBeSettled} = res.data
summaryList[2].num = totalShipment
summaryList[3].num = totalIncome
shipmentList[0].num = toBeShipped
shipmentList[1].num = roughWeight
shipmentList[2].num = shipmentReview
shipmentList[3].num = toBeSettled
}
});
onMounted(() => {
// #ifdef APP-PLUS || MP-WEIXIN
let menuButtonInfo = uni.getMenuButtonBoundingClientRect();
navbarRect.height = menuButtonInfo.height;
navbarRect.top = menuButtonInfo.top;
getSafeHeight();
// #endif
//
});
</script>
<style lang="scss" scoped>
.contaner {
padding: 17rpx;
/* #ifdef H5 */
height: calc(100vh - 67px - 70px) !important;
/* #endif */
overflow: auto;
.summary {
.panel {
width: 50%;
display: inline-block;
height: 155rpx;
position: relative;
// background: url('/static/img/01.png');
image {
width: 100%;
height: 100%;
}
.box {
position: absolute;
padding: 20rpx 0rpx 0rpx 40rpx;
margin-top: -155rpx;
.num {
font-size: 40rpx;
font-family: Source Han Sans CN;
font-weight: bold;
color: #ffffff;
}
.title {
font-size: 24rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
}
}
}
}
.p-15 {
padding: 15rpx;
}
.data-detail {
margin-top: 15rpx;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
position: relative;
.title {
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #000000;
padding-left: 20rpx;
&::before {
content: "";
position: absolute;
margin-top: 6px;
margin-left: -20rpx;
width: 6rpx;
height: 26rpx;
background: #22d594;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 3rpx;
}
}
.title-shipment {
&::before {
content: "";
background: #ff782b;
}
}
.data-receive,
.data-shipment {
margin: 15rpx 15rpx 15rpx;
.box {
width: 141.15rpx;
height: 141.15rpx;
background: #fffaf7;
border: 1px solid #f0936b;
box-shadow: 0rpx 7rpx 12rpx 0rpx rgba(146, 44, 0, 0.2);
border-radius: 26rpx;
text-align: center;
vertical-align: middle;
display: table-cell;
// display: flex;
// align-items: center;
position: relative;
top: 50%;
// transform: translateY(-50%);
.num {
font-size: 32rpx;
font-family: Source Han Sans CN;
font-weight: bold;
/* #ifdef H5 */
margin-top: 0.7rem;
/* #endif */
}
.desc {
font-size: 24rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
}
}
}
.data-shipment {
margin-bottom: 21rpx;
}
.line {
height: 18rpx;
background: #f8f8f8;
}
.app-list {
padding: 15rpx;
padding-bottom: 0rpx;
.name {
text-align: center;
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #000000;
margin-bottom: 20rpx;
}
.grid-text {
margin-top: 17rpx;
margin-bottom: 20rpx;
font-size: 24rpx;
}
}
}
}
.tabBar {
background: url("/static/img/TabMenu/bg.png");
height: 141.28rpx;
background-size: cover;
position: sticky;
width: 100%;
bottom: 0px;
.tabMenuBox {
padding-top: 35rpx;
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
.grid-text {
margin-top: 10rpx;
}
.circle-box {
width: 154rpx;
height: 154rpx;
background: linear-gradient(0deg, #1992ef, #00f6ff);
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 50, 100, 0.12);
border-radius: 50%;
font-weight: 500;
color: #ffffff;
position: absolute;
margin-top: -49rpx;
margin-left: calc(50% - 78rpx);
}
.normal-box {
width: 150rpx;
height: 150rpx;
text-align: center;
}
}
}
</style>

View File

@ -0,0 +1,209 @@
<template>
<view class="search">
<view v-if="!isShowSearch" @click="isShowSearch = true">
<u-icon color="#C1C1C1" name="search"></u-icon
><text>请输入供应商名称</text>
</view>
<u-search
v-else
placeholder="请输入供应商名称"
v-model="keyword"
:focus="true"
bgColor="#fff"
:clearabled="true"
:showAction="false"
placeholderColor="#C1C1C1"
></u-search>
</view>
<view class="card-box">
<view class="c-tab">
<text
v-for="(item, index) in tabList"
:key="index"
:class="{ active: currentTab === item.name }"
@click="handleTab(item)"
>
{{ item.name }}
</text>
</view>
<block v-for="item in 10" :key="item">
<view class="inner-box">
<view class="top-flex-box">
<view>
<view>
<text class="number">收货单号SHD20230901132333</text>
</view>
<view>
<text class="name">陡其成</text>
</view>
</view>
</view>
<view class="bottom-flex-box">
<view>
<view>
<text class="desc">过磅总净重1870.00KG</text>
</view>
<view class="flex-box">
<text>贷款金额2510.00</text>
</view>
</view>
<view>
<text class="btn">
<text v-if="currentTab === '等待审核'">去审核</text>
<text v-if="currentTab === '已审未付'">去支付</text>
<text v-if="currentTab === '已审已付'">查看</text>
</text>
</view>
</view>
</view>
<view class="line" v-show="item !== 10"> </view>
</block>
</view>
<view class="btn-box">
<u-button
text="全选/取消"
color="#fff"
:customStyle="{ color: '#00DCEE', border: '1px solid #00DCEE' }"
></u-button>
<u-button type="primary" text="批量审核"></u-button>
</view>
</template>
<script setup lang="ts">
const keyword = ref();
const isShowSearch = ref(false);
const tabList = reactive([
{
name: "等待审核",
},
{
name: "已审未付",
},
{
name: "已审已付",
},
]);
const currentTab = ref("等待审核");
const handleTab = (item: any) => {
currentTab.value = item.name;
};
</script>
<style lang="scss" scoped>
.search {
box-shadow: 0rpx 3rpx 16rpx 5rpx rgba(0, 0, 0, 0.2);
border-radius: 28rpx;
background: rgba(255, 255, 255, 0.86);
width: 80%;
margin: 0px auto;
margin-top: 30rpx;
font-weight: 400;
font-size: 27rpx;
color: #c1c1c1;
> view {
line-height: 60rpx;
text-align: center;
display: flex;
justify-content: center;
}
text {
margin-left: 15rpx;
}
}
.card-box {
.c-tab {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 27rpx;
color: #999999;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-around;
border-bottom: 1rpx solid rgba(233, 233, 233, 0.76);
text {
padding: 16rpx;
}
.active {
color: $u-primary;
border-bottom: 5rpx solid $u-primary;
border-radius: 5rpx;
}
}
.inner-box {
padding: 40rpx 40rpx;
.bottom-flex-box {
display: flex;
justify-content: space-between;
align-items: center;
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
}
.line {
height: 18rpx;
background: #f8f8f8;
}
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 0rpx 25rpx;
margin-top: 35rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
.address {
margin-right: 30rpx;
}
.type,
.desc {
font-size: 21rpx;
color: #999999;
}
.desc {
margin-top: 30rpx;
display: inline-block;
}
.name {
font-size: 32rpx;
color: #000000;
}
.flex-box {
font-weight: 400;
font-size: 32rpx;
color: #000000;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.btn-box {
margin-top: 60rpx;
display: flex;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
padding: 25rpx 50rpx;
position: sticky;
bottom: 0rpx;
width: calc(100vw - 100rpx);
::v-deep button {
border-radius: 43rpx;
}
::v-deep button + button {
margin-left: 50rpx;
}
}
</style>

View File

@ -0,0 +1,7 @@
<template>
待定价
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
</style>

128
src/pages/index/pricing.vue Normal file
View File

@ -0,0 +1,128 @@
<template>
<view class="card-box">
<view class="top-flex-box">
<view>
<view>
<text class="address">上海奉贤两网融合</text>
<text class="type">(大磅)</text>
</view>
<view>
<text class="number">收货单号SHD20230901132333</text>
</view>
<view>
<text class="name">陡其成</text>
</view>
</view>
<view>
<text class="btn" @click="handleScenePhoto()">现场照片</text>
</view>
</view>
<view>
<text class="desc">毛重时间2023-09-01 13:23:33</text>
</view>
<view class="flex-box">
<text>毛重2510kg</text>
<text>单价未定价</text>
</view>
<view class="btn-box">
<u-button
text="点击作废"
color="#E8E8E8"
:customStyle="{ color: '#999' }"
@click="handleModal(true)"
></u-button>
<u-button type="primary" text="点击定价"></u-button>
</view>
</view>
<SmallModal :title="'确认作废吗?'" :content="'确认作废后,该订单不能恢复!'" :okText="'确认作废'" :isMain="true" :show="isShowCancelModal" @handleModal="(v:boolean) => {handleModal(v)}"/>
</template>
<script setup lang="ts">
import { ReceiveApi } from "@/services/index";
import SmallModal from '@/components/Modal/smallModal.vue'
const pageList = reactive({
total: 0,
list: [],
pageNum: 1,
pageSize: 10,
});
const isShowCancelModal = ref(false)
const handleModal = (v: boolean) => {
isShowCancelModal.value = v
}
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
ReceiveApi.getOrderPage({ pageNumber: 1, pageSize: 10 }).then((res) => {
if (res.code === 200) {
(pageList as any).list = res.data.list;
}
});
</script>
<style lang="scss" scoped>
.card-box {
padding: 38rpx 50rpx;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 0rpx 25rpx;
margin-top: 35rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
.top-flex-box {
display: flex;
justify-content: space-between;
align-items: center;
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
cursor: pointer;
}
}
.address {
margin-right: 30rpx;
}
.type,
.desc {
font-size: 21rpx;
color: #999999;
}
.desc {
margin-top: 30rpx;
display: inline-block;
}
.name {
font-size: 32rpx;
color: #000000;
}
.flex-box {
font-weight: 400;
font-size: 32rpx;
color: #000000;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.btn-box {
margin-top: 60rpx;
display: flex;
::v-deep button {
border-radius: 43rpx;
}
::v-deep button + button {
margin-left: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,7 @@
<template>
待定价
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,7 @@
<template>
待定价
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,99 @@
<template>
<view class="card-box">
<view class="top-flex-box">
<view>
<view>
<text class="address">上海奉贤两网融合</text>
<text class="type">(大磅)</text>
</view>
<view>
<text class="number">收货单号SHD20230901132333</text>
</view>
<view>
<text class="name">陡其成</text>
</view>
</view>
<view>
<text class="btn">现场照片</text>
</view>
</view>
<view>
<text class="desc">毛重时间2023-09-01 13:23:33</text>
</view>
<view class="flex-box">
<text>皮重2510kg</text>
</view>
<view class="btn-box">
<u-button
text="点击作废"
color="#E8E8E8"
:customStyle="{ color: '#999' }"
></u-button>
<u-button type="primary" text="点击编辑"></u-button>
</view>
</view>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped>
.card-box {
padding: 38rpx 50rpx;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 0rpx 25rpx;
margin-top: 35rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
.top-flex-box {
display: flex;
justify-content: space-between;
align-items: center;
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.address {
margin-right: 30rpx;
}
.type,
.desc {
font-size: 21rpx;
color: #999999;
}
.desc {
margin-top: 30rpx;
display: inline-block;
}
.name {
font-size: 32rpx;
color: #000000;
}
.flex-box {
font-weight: 400;
font-size: 32rpx;
color: #000000;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.btn-box {
margin-top: 60rpx;
display: flex;
::v-deep button {
border-radius: 43rpx;
}
::v-deep button + button {
margin-left: 50rpx;
}
}
}
</style>

100
src/pages/index/tareing.vue Normal file
View File

@ -0,0 +1,100 @@
<template>
<view class="card-box">
<view class="top-flex-box">
<view>
<view>
<text class="address">上海奉贤两网融合</text>
<text class="type">(大磅)</text>
</view>
<view>
<text class="number">收货单号SHD20230901132333</text>
</view>
<view>
<text class="name">陡其成</text>
</view>
</view>
<view>
<text class="btn">现场照片</text>
</view>
</view>
<view>
<text class="desc">毛重时间2023-09-01 13:23:33</text>
</view>
<view class="flex-box">
<text>毛重2510kg</text>
<text>单价5/kg</text>
</view>
<view class="btn-box">
<u-button
text="点击作废"
color="#E8E8E8"
:customStyle="{ color: '#999' }"
></u-button>
<u-button type="primary" text="点击编辑"></u-button>
</view>
</view>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped>
.card-box {
padding: 38rpx 50rpx;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 0rpx 25rpx;
margin-top: 35rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
.top-flex-box {
display: flex;
justify-content: space-between;
align-items: center;
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.address {
margin-right: 30rpx;
}
.type,
.desc {
font-size: 21rpx;
color: #999999;
}
.desc {
margin-top: 30rpx;
display: inline-block;
}
.name {
font-size: 32rpx;
color: #000000;
}
.flex-box {
font-weight: 400;
font-size: 32rpx;
color: #000000;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.btn-box {
margin-top: 60rpx;
display: flex;
::v-deep button {
border-radius: 43rpx;
}
::v-deep button + button {
margin-left: 50rpx;
}
}
}
</style>

View File

@ -0,0 +1,80 @@
<template>
<swiper
class="swiper"
circular
:indicator-dots="true"
:autoplay="false"
:interval="2000"
:duration="500"
indicator-active-color="#00DCEE"
>
<swiper-item v-for="(item, index) in list" :key="index">
<view class="image-box">
<image :src="`/static/img/launch/${item.imgUrl}`"></image>
<view class="title">
{{ item.title }}
</view>
<view v-if="index === 3" class="btn-start" @click="start()">
立即启用
</view>
</view>
</swiper-item>
</swiper>
</template>
<script setup lang="ts">
const list = [
{
title: "智能回收 智慧未来!",
imgUrl: "1.png",
},
{
title: "高效管理 安全快捷!",
imgUrl: "2.png",
},
{
title: "全新系统 崭新界面!",
imgUrl: "3.png",
},
{
title: "全城握手 致富从这里开始!",
imgUrl: "4.png",
},
];
const start = () => {
uni.navigateTo({
url: "/pages/login/index", //
});
};
</script>
<style lang="scss" scoped>
.swiper {
width: 100%;
height: 80vh;
margin-top: 10vh;
.image-box {
text-align: center;
cursor: pointer;
}
.title {
font-size: 40rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #00d2e3;
margin-top: 90rpx;
}
.btn-start {
height: 88rpx;
background: #00dcee;
border-radius: 44rpx;
line-height: 88rpx;
font-size: 37rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #ffffff;
width: 80%;
margin: 0px auto;
margin-top: 50rpx;
cursor: pointer;
}
}
</style>

View File

@ -0,0 +1,33 @@
<template>
<view class="c-login-container">
<!-- logo -->
<view class="logo">
<image :src="`/static/img/logo.png`" height="60rpx"></image>
</view>
<!-- form表单 -->
<view class="login-form">
<slot name="form-box"></slot>
</view>
</view>
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
.c-login-container {
height: 80vh;
margin-top: 10vh;
.logo {
text-align: center;
image {
width: 234.62rpx;
height: 62.18rpx;
}
}
.login-form {
margin-top: 100rpx;
padding: 100rpx;
}
}
</style>

View File

@ -0,0 +1,228 @@
<template>
<LoginLayout>
<template #form-box>
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="loginForm"
:labelWidth="0"
>
<u-form-item
v-for="(item, index) in formAttrList"
:key="index"
:prop="`userInfo.${item.modelName}`"
>
<view v-if="item.type === 'text'">
<u-input
v-model="model1.userInfo[`${item.modelName}`]"
:placeholder="item.placeholder"
:shape="'circle'"
:clearable="true"
:customStyle="{
'border-color':
currentFocus === item.modelName ? '#00dcee !important' : '',
}"
@focus="handleFocus(item.modelName)"
@blur="handleFocus('')"
>
<template #suffix>
<text v-if="item.modelName === 'code'" class="code-btn">
<text
v-if="seconds === 0"
@click="handleCode"
class="code-primary"
>获取验证码</text
>
<text v-else
>剩余<text class="code-primary">{{ seconds }}</text></text
>
</text>
</template>
</u-input>
</view>
<view v-if="item.type === 'password'">
<u-input
v-model="model1.userInfo[`${item.modelName}`]"
:placeholder="item.placeholder"
:shape="'circle'"
:clearable="true"
:type="item.isShowPwd ? 'text' : 'password'"
:customStyle="{
'border-color':
currentFocus === item.modelName ? '#00dcee !important' : '',
}"
@focus="handleFocus(item.modelName)"
@blur="handleFocus('')"
>
<template #suffix>
<image
v-if="!item.isShowPwd"
:src="`/static/img/login/hide.png`"
class="custom-icon"
@click="item.isShowPwd = true"
></image>
<image
v-else
:src="`/static/img/login/show.png`"
class="custom-icon"
@click="item.isShowPwd = false"
></image>
</template>
</u-input>
</view>
</u-form-item>
</u-form>
<view class="login-btn">
<u-button
@click="submit"
type="primary"
:customStyle="{
'border-radius': '43rpx',
}"
>保存并登录</u-button
>
</view>
</template>
</LoginLayout>
</template>
<script setup lang="ts">
import { ProfileApi } from "@/services/index";
import LoginLayout from "./components/loginLayout.vue";
import valid from "@/utils/validate";
const loginForm = ref(null);
const model1 = <any>reactive({
userInfo: {
userName: "",
code: "",
passwordNew: "",
passwordConfirm: "",
},
});
// focus
const currentFocus = ref("");
//
const formAttrList = ref([
{
modelName: "userName",
type: "text",
placeholder: "请输入手机号",
},
{
modelName: "code",
type: "text",
placeholder: "请输入验证码",
},
{
modelName: "passwordNew",
type: "password",
placeholder: "请输入新密码",
isShowPwd: false, //
},
{
modelName: "passwordConfirm",
type: "password",
placeholder: "请输入确认密码",
isShowPwd: false, //
},
]);
//
const seconds = ref(0);
const handleCode = () => {
console.log(model1);
if (model1.userInfo === undefined || !model1.userInfo.userName) {
uni.showToast({
title: "请输入手机号",
icon: "error",
});
return;
}
if (!valid.mobile.pattern.test(model1.userInfo.userName)) {
uni.showToast({
title: "手机号不合法",
icon: "error",
});
return;
}
seconds.value = 120;
let countDownTimer = setInterval(() => {
if (seconds.value > 0) {
--seconds.value;
} else {
clearInterval(countDownTimer);
}
}, 1000);
};
const rules = ref({
"userInfo.userName": {
type: "string",
required: true,
message: "请输入手机号",
trigger: ["blur", "change"],
},
"userInfo.code": {
type: "string",
required: true,
message: "请输入验证码",
trigger: ["blur", "change"],
},
"userInfo.passwordNew": {
type: "string",
required: true,
message: "请输入新密码",
trigger: ["blur", "change"],
},
"userInfo.passwordConfirm": {
type: "string",
required: true,
message: "请输入确认密码",
trigger: ["blur", "change"],
},
// "userInfo.sex": {
// type: "string",
// max: 1,
// required: true,
// message: "",
// trigger: ["blur", "change"],
// },
});
// const checkboxChange = (n: any) => {
// console.log("change", n);
// };
const handleFocus = (attr: string) => {
currentFocus.value = attr;
};
const submit = () => {
ProfileApi.loginByAccount({
userName: "cs123",
password: "123",
});
(loginForm.value as any).validate();
};
</script>
<style lang="scss" scoped>
.custom-icon {
width: 37.18rpx;
height: 18.59rpx;
}
.login-btn {
margin-top: 23.72rpx;
}
::v-deep .u-form-item__body__right__message {
margin-left: 10px !important;
}
.code-btn {
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 400;
cursor: pointer;
.code-primary {
color: $u-primary;
}
}
</style>

View File

@ -0,0 +1,95 @@
<template>
<view class="c-login-container">
<view>
<u-form labelPosition="left" :model="model1" :rules="rules" ref="loginForm" :labelWidth="0">
<u-form-item prop="userInfo.name" ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请输入手机号"
:shape="'circle'"
></u-input>
</u-form-item>
<u-form-item prop="userInfo.name" ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请输入验证码"
:shape="'circle'"
>
<template #suffix>
<text>获取验证码</text>
</template>
</u-input>
</u-form-item>
<u-form-item prop="userInfo.name" ref="item1">
<u-input
v-model="model1.userInfo.name"
placeholder="请设置密码"
:shape="'circle'"
:type="'password'"
></u-input>
</u-form-item>
<u-form-item>
<view class="c-flex-space-between">
<u-checkbox-group
v-model="checkboxValue1"
placement="column"
@change="checkboxChange"
>
<u-checkbox
:customStyle="{ fontSize: '8px' }"
:key="'1'"
:label="'记住密码'"
:name="'记住密码'"
/>
</u-checkbox-group>
<text class="f-s-15 l-h-28">无法收到验证码</text>
</view>
</u-form-item>
</u-form>
<u-button @click="submit">立即登录</u-button>
</view>
</view>
</template>
<script setup lang="ts">
const loginForm = ref(null);
const checkboxValue1 = ref([]);
const model1 = ref({
userInfo: {
name: "",
sex: "",
},
});
const rules = ref({
"userInfo.name": {
type: "string",
required: true,
message: "请填写姓名",
trigger: ["blur", "change"],
},
"userInfo.sex": {
type: "string",
max: 1,
required: true,
message: "请选择男或女",
trigger: ["blur", "change"],
},
});
const checkboxChange = (n: any) => {
console.log("change", n);
};
const submit = () => {
(loginForm.value as any).validate();
};
</script>
<style lang="scss" scoped>
.c-flex-space-between {
display: flex;
justify-content: space-between;
width: 100%;
font-size: 12px;
}
</style>

210
src/pages/login/index.vue Normal file
View File

@ -0,0 +1,210 @@
<template>
<LoginLayout>
<template #form-box>
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="loginForm"
:labelWidth="0"
>
<u-form-item prop="userInfo.userName">
<u-input
v-model="model1.userInfo.userName"
placeholder="请输入手机号"
:shape="'circle'"
:clearable="true"
:customStyle="{
'border-color':
currentFocus === 'userName' ? '#00dcee !important' : '',
}"
@focus="handleFocus('userName')"
@blur="handleFocus('')"
>
</u-input>
</u-form-item>
<u-form-item prop="userInfo.password">
<u-input
v-model="model1.userInfo.password"
placeholder="请输入密码"
:shape="'circle'"
:clearable="true"
:type="isShowPwd ? 'text' : 'password'"
:customStyle="{
'border-color':
currentFocus === 'password' ? '#00dcee !important' : '',
}"
@focus="handleFocus('password')"
@blur="handleFocus('')"
>
<template #suffix>
<image
v-if="!isShowPwd"
:src="`/static/img/login/hide.png`"
class="custom-icon"
@click="isShowPwd = true"
></image>
<image
v-else
:src="`/static/img/login/show.png`"
class="custom-icon"
@click="isShowPwd = false"
></image>
</template>
</u-input>
</u-form-item>
</u-form>
<view class="remember-box">
<view>
<u-checkbox-group v-model="checkGroup.rememberCheck">
<u-checkbox
:customStyle="{}"
:key="1"
:label="'记住密码?'"
:name="1"
:size="'25rpx'"
:activeColor="'#00dcee'"
:labelSize="'25rpx'"
:labelColor="'#000000'"
></u-checkbox>
</u-checkbox-group>
</view>
<text @click="handleForgetPwd">忘记密码</text>
</view>
<view class="login-btn">
<u-button
@click="submit"
type="primary"
:customStyle="{
'border-radius': '43rpx',
}"
>立即登录</u-button
>
</view>
<view class="agree">
<u-checkbox-group v-model="checkGroup.agreeCheck">
<u-checkbox
:key="1"
:size="'25rpx'"
:activeColor="'#00dcee'"
:name="1"
></u-checkbox>
</u-checkbox-group>
<view>
我已阅读并同意用户 <text class="agree-item"> 服务协议 </text>
<text class="agree-item"> 隐私政策 </text>
<view> 未开通服务站点无法登录 </view>
</view>
</view>
</template>
</LoginLayout>
</template>
<script setup lang="ts">
import { ProfileApi } from "@/services/index";
import LoginLayout from "./components/loginLayout.vue";
import { useMemberStore } from "@/store/index";
const store = useMemberStore();
const loginForm = ref(null);
const model1 = reactive({
userInfo: {
userName: "",
password: "",
},
});
// focus
const currentFocus = ref("");
//
const isShowPwd = ref(false);
// //
const checkGroup = reactive({
rememberCheck: [],
agreeCheck: [],
});
const rules = ref({
"userInfo.userName": {
type: "string",
required: true,
message: "请输入手机号",
trigger: ["blur", "change"],
},
"userInfo.password": {
type: "string",
required: true,
message: "请输入密码",
trigger: ["blur", "change"],
},
});
// const checkboxChange = (n: any) => {
// console.log("change", n);
// };
const handleFocus = (attr: string) => {
currentFocus.value = attr;
};
const submit = () => {
(loginForm.value as any).validate().then((res: any) => {
if (res) {
if (checkGroup.agreeCheck.length === 0) {
uni.showToast({
title: "请同意协议",
icon: "none",
});
return;
}
ProfileApi.loginByAccount(model1.userInfo).then((res: any) => {
if (res.code === 200) {
store.setProfile(res.data);
uni.navigateTo({
url: "/pages/index/index", //
});
}
});
}
});
uni.navigateTo({
url: "/pages/index/index", //
});
};
const handleForgetPwd = () => {
uni.navigateTo({
url: "/pages/login/forgetPwd", //
});
};
</script>
<style lang="scss" scoped>
.custom-icon {
width: 37.18rpx;
height: 18.59rpx;
}
.remember-box {
display: flex;
font-size: 25rpx;
font-family: Source Han Sans CN;
font-weight: 400;
justify-content: space-between;
padding: 10rpx;
color: $u-primary;
align-items: center;
}
.login-btn {
margin-top: 23.72rpx;
}
.agree {
display: flex;
font-size: 21rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
margin-top: 10rpx;
align-items: flex-start;
text-align: center;
line-height: 41rpx;
margin-top: 26.28rpx;
.agree-item {
color: $u-primary;
}
}
</style>

View File

@ -0,0 +1,71 @@
<template>
<view class="msg-box">
<view class="u-page">
<u-list @scrolltolower="scrolltolower">
<u-list-item v-for="(item, index) in 20" :key="index">
<u-cell>
<view slot="title" class="u-slot-title">
<view>
<view class="u-cell-text title"
>系统通知
<text class="title-badge">
</text>
</view>
<view class="u-cell-text desc">你有一笔收货单待定价</view>
</view>
</view>
<template #value>
<text class="u-slot-value time">2024-2-21 13:15</text>
</template>
</u-cell>
</u-list-item>
</u-list>
</view>
</view>
</template>
<script setup lang="ts">
const scrolltolower = () => {
loadmore();
};
const loadmore = () => {
console.log("****** 加载更多");
};
</script>
<style lang="scss">
.msg-box {
background: #f8f8f8;
width: 100%;
height: 100%;
.title {
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
position: relative;
width: fit-content;
.title-badge {
position: absolute;
right: -6px;
top: 0px;
width: 17rpx;
height: 17rpx;
background: #ec0f3e;
border-radius: 50%;
display: inline-block;
}
}
.desc {
font-size: 21rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
margin-top: 12.18rpx;
}
.time {
font-size: 24rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #999999;
}
}
</style>

View File

@ -0,0 +1,36 @@
<template>
<view class="baseinfo">
<view class="box">
<view> 用户名 {{ profile.userName }} </view>
<view> 手机号码 {{ profile.phone }} </view>
</view>
</view>
</template>
<script setup lang="ts">
import { useMemberStore } from '@/store/index'
const store = useMemberStore()
const profile = store.profile.userInfo
</script>
<style lang="scss">
.baseinfo {
background: #f8f8f8;
height: 100vh;
padding: 26.28rpx 25.64rpx;
.box {
padding: 0rpx 18.59rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
> view {
line-height: 80rpx;
}
view+view {
border-top: 1px solid #E9E9E9;
}
}
}
</style>

133
src/pages/profile/index.vue Normal file
View File

@ -0,0 +1,133 @@
<template>
<view class="profile">
<view>
<image class="bg" :src="`/static/img/profile/bg.png`" />
</view>
<view class="baseinfo">
<view class="head">
<image :src="`/static/img/profile/user.png`" class="user"></image>
<view>
<view>
<text class="name">{{ profile.userName || "-" }}</text>
</view>
<view>
<text class="company">{{ profile.factory_name || "-" }}</text>
</view>
</view>
</view>
<view class="content">
<u-list :height="'130px'">
<u-list-item v-for="(item, index) in list" :key="index">
<u-cell
:title="item.name"
arrow-direction="right"
isLink
:url="item.path"
:border="false"
@click="hanldeClick(item)"
>
<template #icon>
<view style="width: 40rpx">
<image :src="`/static/img/profile/${item.icon}`" />
</view>
</template>
</u-cell>
</u-list-item>
</u-list>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { ProfileApi } from "@/services/index";
import { reactive } from "vue";
import { useMemberStore } from "@/store/index";
const store = useMemberStore();
const profile = store.profile.userInfo;
const list = reactive([
{
name: "基本信息",
icon: "baseinfo.png",
path: "/pages/profile/baseinfo",
},
{
name: "修改密码",
icon: "modifyPwd.png",
path: "/pages/profile/modifyPwd",
},
{
name: "退出登录",
icon: "logout.png",
path: "",
},
]);
const hanldeClick = (item: any) => {
if (item.name === "退出登录") {
uni.navigateTo({
url: "/pages/login/index", //
});
ProfileApi.logOut().then((res: any) => {
if (res.code === 200) {
uni.navigateTo({
url: "/pages/login/index", //
});
}
});
}
};
</script>
<style lang="scss">
.profile {
.bg {
width: 100%;
position: absolute;
top: -60rpx;
z-index: -1;
}
.baseinfo {
padding: 25.64rpx;
.head {
display: flex;
align-items: center;
margin-left: 41rpx;
.user {
width: 110.9rpx;
height: 110.9rpx;
margin-right: 20.51rpx;
}
.name {
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 500;
color: #000000;
}
.company {
font-size: 21rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
}
}
.content {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 28.21rpx 21.15rpx;
margin-top: 24.36rpx;
image:nth-child(1) {
width: 28.85rpx;
height: 24.36rpx;
}
image:nth-child(2) {
width: 25rpx;
height: 32.69rpx;
}
image:nth-child(3) {
width: 30.13rpx;
height: 30.13rpx;
}
}
}
}
</style>

View File

@ -0,0 +1,119 @@
<template>
<view class="baseinfo">
<view class="box">
<u-form
labelPosition="left"
:model="model1"
:rules="rules"
ref="loginForm"
:labelWidth="0"
>
<u-form-item
v-for="(item, index) in formAttrList"
:key="index"
:prop="`userInfo.${item.modelName}`"
>
<u-input
:border="index === 2 ? 'none' : 'bottom'"
v-model="model1.userInfo[`${item.modelName}`]"
:placeholder="item.placeholder"
:clearable="true"
:type="'password'"
></u-input>
</u-form-item>
</u-form>
</view>
<view class="save-btn">
<u-button
@click="submit"
type="primary"
:customStyle="{
'border-radius': '43rpx',
}"
>保存</u-button
>
</view>
</view>
</template>
<script setup lang="ts">
//
const formAttrList = ref([
{
modelName: "password",
type: "password",
placeholder: "请输入当前密码",
},
{
modelName: "passwordNew",
type: "password",
placeholder: "请输入新密码",
},
{
modelName: "passwordConfirm",
type: "password",
placeholder: "请确认新密码",
},
]);
const model1 = <any>reactive({
userInfo: {
userName: "",
password: "",
},
});
const rules = ref({
"userInfo.password": {
type: "string",
required: true,
message: "请输入当前密码",
trigger: ["blur", "change"],
},
"userInfo.passwordNew": {
type: "string",
required: true,
message: "请输入新密码",
trigger: ["blur", "change"],
},
"userInfo.passwordConfirm": {
type: "string",
required: true,
message: "请输入确认密码",
trigger: ["blur", "change"],
},
});
const submit = () => {};
</script>
<style lang="scss">
.baseinfo {
background: #f8f8f8;
height: 100vh;
padding: 26.28rpx 25.64rpx;
.box {
padding: 18.59rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
font-size: 27rpx;
font-family: Source Han Sans CN;
font-weight: 400;
color: #000000;
::v-deep .u-border-bottom {
border-color: rgb(233 233 233 / 0.76) !important;
}
::v-deep .u-form-item__body__right__message {
height: 0px;
display: none;
}
::v-deep .u-form-item {
height: 45px;
}
}
.save-btn {
margin-top: 150px;
button {
width: 80%;
}
}
}
</style>

View File

@ -0,0 +1,62 @@
<template>
<view class="layout">
<view class="name">现场照片</view>
<view class="time">2024-01-22 14:28:36</view>
<up-row customStyle="flex-wrap: wrap">
<up-col span="6" v-for="(item, index) in 10" :key="item">
<view
class="grid-item"
:style="{
marginLeft: index % 2 === 1 ? '10rpx' : '',
marginRight: index % 2 === 0 ? '10rpx' : '',
marginBottom: '10rpx'
}"
>
<text class="tip">毛重过磅</text>
<image src="/static/img/temp/car.png" mode="'heightFix'" />
</view>
</up-col>
</up-row>
</view>
</template>
<script setup lang="ts"></script>
<style lang="scss" scoped>
.layout {
margin: 22.44rpx 26.54rpx;
padding: 33rpx 18rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
font-family: Source Han Sans CN;
.name {
font-weight: 400;
font-size: 24rpx;
color: #000000;
line-height: 41rpx;
}
.time {
font-weight: 400;
font-size: 21rpx;
color: #999999;
line-height: 41rpx;
}
.grid-item {
position: relative;
image {
width: 100%;
}
.tip {
background: rgba(0, 0, 0, 0.63);
box-shadow: 0rpx 0rpx 6rpx 0rpx rgba(0, 0, 0, 0.09);
border-radius: 0rpx 40rpx 40rpx 0rpx;
font-weight: 400;
font-size: 21rpx;
color: #ffffff;
padding: 10rpx 30rpx;
position: absolute;
margin-top: 40rpx;
}
}
}
</style>

View File

@ -0,0 +1,275 @@
<template>
<view class="c-layout">
<StatisticCard :list="list" />
<view class="card-box">
<view class="c-tab">
<text
v-for="(item, index) in tabList"
:key="index"
:class="{ active: currentTab === item.name }"
@click="handleTab(item)"
>
{{ item.name }}
</text>
</view>
<view class="c-grid">
<view class="box">
<view v-for="(item, index) in gridList1" :key="index">
<text>{{ item.name }}</text><text>{{ item.isBefore ? item.unit : ''}} {{ randomNum(index)}} {{ item.isBefore ? '' : item.unit }} </text>
</view>
</view>
<view class="box">
<view v-for="(item, index) in gridList2" :key="index">
<text v-if="item.name">{{ item.name }}</text><text v-if="item.num">{{ item.isBefore ? item.unit : ''}} {{ randomNum(index) }} {{ item.isBefore ? '' : item.unit }} </text>
</view>
</view>
<view class="box">
<view v-for="(item, index) in gridList3" :key="index">
<text>{{ item.name }}</text><text>{{ item.isBefore ? item.unit : ''}} {{ randomNum(index) }} {{ item.isBefore ? '' : item.unit }} </text>
</view>
</view>
</view>
</view>
</view>
<TimeRangeFilter :show="isShowTimeDialog" @handleDialog="handleDialog"/>
</template>
<script setup lang="ts">
import StatisticCard from "@/components/StatisticCard/index.vue";
import TimeRangeFilter from './components/TimeRangeFilter.vue'
const list = reactive([
{
num: 8923.0,
name: "客户应收款总额",
},
{
num: 8923.0,
name: "供应商应付款总额",
},
]);
const currentTab = ref("昨日");
const tabList = reactive([
{
name: "昨日",
},
{
name: "本月",
},
{
name: "本年",
},
{
name: "自定义",
},
]);
const handleTab = (item: any) => {
if (item.name === '自定义') {
handleDialog(true)
} else {
currentTab.value = item.name;
}
};
const randomNum = (index:number) => {
return Math.floor(Math.random() * (10000 - 1 + 1)) + 1 + index
}
const gridList1 = reactive([
{
name: "出货收入",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "实际收入",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "收货支出",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "实际支出",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "杂费支出",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "运费支出",
num: "6000.00",
unit: '¥',
isBefore: true
},
]);
const gridList2 = reactive([
{
name: "出货实收金额",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "出货应收金额",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "出货笔数",
num: "2",
},
{
name: "",
num: "",
},
{
name: "出货总重量",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "出货净重(客户)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "出货重量(已结)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "结算总重量",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "出货重量(未结)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "结算重量(已结)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "净重误差",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "结算总量(未结)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
]);
const gridList3 = reactive([
{
name: "收货总重量",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "收货笔数",
num: "2",
unit: '',
isBefore: false
},
{
name: "收货重量(已付)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "收货实付金额",
num: "6000.00",
unit: '¥',
isBefore: true
},
{
name: "收货重量(未付)",
num: "6000.00",
unit: 'KG',
isBefore: false
},
{
name: "收货应付金额",
num: "6000.00",
unit: '¥',
isBefore: true
},
]);
const isShowTimeDialog = ref(false)
const handleDialog = (v: boolean) => {
isShowTimeDialog.value = v
}
</script>
<style lang="scss" scoped>
.card-box {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin-top: 25rpx;
.c-tab {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 27rpx;
color: #999999;
line-height: 41rpx;
display: flex;
align-items: center;
justify-content: space-around;
border-bottom: 1rpx solid rgba(233, 233, 233, 0.76);
text {
padding: 16rpx;
}
.active {
color: $u-primary;
border-bottom: 5rpx solid $u-primary;
border-radius: 5rpx;
}
}
.c-grid {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
.box {
padding: 30rpx;
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
> view {
line-height: 50rpx;
}
}
.box + .box {
border-top: 18rpx solid #F8F8F8;
}
}
}
</style>

View File

@ -0,0 +1,94 @@
<template>
<u-popup :show="show" mode="left" :closeable="true" @close="handleClose">
<view class="c-dialog-filter">
<view class="title">筛选</view>
<u-list>
<u-list-item>
<u-cell :title="`供应商`" @click="handleDialog('showSupplier', true)">
<template #right-icon> </template>
</u-cell>
</u-list-item>
<u-list-item boder="none">
<u-cell :title="`收货产品`" @click="handleDialog('showProduct', true)">
<template #right-icon> </template>
</u-cell>
</u-list-item>
</u-list>
<view class="btn-layout">
<view class="btn">
<up-button type="primary" text="确定"></up-button>
</view>
</view>
<view class="btn-layout">
<view class="btn">
<u-button>重置</u-button>
</view>
</view>
</view>
</u-popup>
<!-- 供应商选择弹框 -->
<SupplierDialog :show="showDialog.showSupplier" @handleDialog="(v:boolean) => {handleDialog('showSupplier', v)}"></SupplierDialog>
<!-- 收货产品弹框 -->
<ProductDialog :show="showDialog.showProduct" @handleDialog="(v:boolean) => {handleDialog('showProduct', v)}"></ProductDialog>
</template>
<script setup lang="ts">
import SupplierDialog from "./SupplierDialog.vue";
import ProductDialog from "./ProductDialog.vue";
const props = defineProps<{
show: boolean;
}>();
const emit = defineEmits(["handleDialog"]);
const handleClose = () => {
emit("handleDialog", false);
};
const showDialog = <
{
[key: string]: boolean
}
>reactive(
{
showProduct: false,
showSupplier: false
}
)
const handleDialog = (key: string, v:boolean) => {
showDialog[key] = v
}
</script>
<style lang="scss" scoped>
.c-dialog-filter {
width: 95vw;
padding: 25rpx;
.title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
text-align: center;
}
::v-deep .u-list {
height: 50vh !important;
.u-cell__title-text {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 27rpx !important;
}
}
.btn-layout {
align-items: center;
justify-content: center;
display: flex;
margin-top: 35rpx;
.btn {
width: 80%;
text-align: center;
::v-deep button {
border-radius: 43rpx;
}
}
}
}
</style>

View File

@ -0,0 +1,87 @@
<template>
<u-popup :show="show" mode="left" :closeable="true" @close="handleClose">
<view class="c-dialog-filter">
<view class="title">收货产品</view>
<view class="dialog-product-layout">
<text v-for="item in 20" :class="{ active: item === 2 }" :key="item"
>钢板料{{ item }}</text
>
</view>
<view class="btn-confirm">
<view class="btn">
<u-button type="primary" :text="'确认'"></u-button>
</view>
</view>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean,
}>()
const emit = defineEmits(['handleDialog']);
const handleClose = () => {
emit('handleDialog', false)
}
</script>
<style lang="scss" scoped>
.c-dialog-filter {
width: 95vw;
padding: 25rpx;
.title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
text-align: center;
}
}
// dialog
.dialog-product-layout {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 42rpx 25rpx;
padding: 19rpx;
display: flex;
justify-content: flex-start;
align-items: center;
flex-flow: row wrap;
max-height: 70vh;
overflow: auto;
text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
padding: 10rpx 20rpx;
margin-bottom: 20rpx;
margin-left: 10rpx;
margin-right: 10rpx;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn-confirm {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
position: absolute;
bottom: 0rpx;
width: 100%;
left: 0rpx;
padding: 27.56rpx;
.btn {
text-align: center;
::v-deep button {
width: 80%;
border-radius: 43rpx;
}
}
}
</style>

View File

@ -0,0 +1,88 @@
<template>
<u-popup :show="show" mode="bottom" :closeable="true" @close="handleClose" :zIndex="999999999999999999">
<view class="c-dialog-filter">
<view class="title">收货产品</view>
<view class="dialog-product-layout">
<text v-for="item in 20" :class="{ active: item === 2 }" :key="item"
>钢板料{{ item }}</text
>
</view>
<view class="btn-confirm">
<view class="btn">
<u-button type="primary" :text="'确认'"></u-button>
</view>
</view>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean,
}>()
const emit = defineEmits(['handleDialog']);
const handleClose = () => {
emit('handleDialog', false)
}
</script>
<style lang="scss" scoped>
.c-dialog-filter {
width: 95vw;
padding: 25rpx;
z-index: 9999999999;
.title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
text-align: center;
}
}
// dialog
.dialog-product-layout {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 42rpx 25rpx;
padding: 19rpx;
display: flex;
justify-content: flex-start;
align-items: center;
flex-flow: row wrap;
max-height: 70vh;
overflow: auto;
text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
padding: 10rpx 20rpx;
margin-bottom: 20rpx;
margin-left: 10rpx;
margin-right: 10rpx;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn-confirm {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
position: absolute;
bottom: 0rpx;
width: 100%;
left: 0rpx;
padding: 27.56rpx;
.btn {
text-align: center;
::v-deep button {
width: 80%;
border-radius: 43rpx;
}
}
}
</style>

View File

@ -0,0 +1,70 @@
<template>
<u-popup :show="show" mode="bottom" :closeable="true" @close="handleClose">
<view class="c-dialog">
<view class="box"><text>单据状态</text></view>
<view class="box-btn"
><text class="active">全部</text><text>已支付</text><text>已审未付</text
><text>未审核</text></view
>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean,
}>()
const emit = defineEmits(['handleDialog']);
const handleClose = () => {
emit('handleDialog', false)
}
</script>
<style lang="scss" scoped>
::v-deep .u-popup__content {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 32rpx 32rpx 0rpx 0rpx;
}
.c-dialog {
margin: 65.38rpx 44.87rpx;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 24rpx;
color: #000000;
.box-btn,
.box {
line-height: 80rpx;
display: flex;
justify-content: space-between;
}
.box-btn {
line-height: 40rpx;
margin-bottom: 30rpx;
text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
width: 117rpx;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn {
font-weight: 500;
font-size: 24rpx;
color: $u-primary;
}
.box-border {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
.line {
height: 18rpx;
background: #f8f8f8;
}
}
</style>

View File

@ -0,0 +1,262 @@
<template>
<u-popup :show="show" mode="left" :closeable="true" @close="handleClose">
<view class="c-dialog-filter">
<view class="title">供应商筛选</view>
<view class="search">
<u-search placeholder=" 请输入供应商名称 / 卡号搜索" v-model="keyword"></u-search>
</view>
<view class="dialog-product-layout">
<!-- 自定义索引列表 -->
<view class="address-book-container">
<!-- 左侧通讯录 -->
<scroll-view
class="scroll-container"
:scroll-y="true"
:scroll-into-view="toView"
:scroll-with-animation="true"
>
<view
class="address-book"
v-for="(item, index) in addressBook"
:key="index"
:id="item.id"
>
<view class="address-book-index">{{ item.id }}</view>
<view
class="contact-container"
v-for="(cItem, index) in item.data"
:key="index"
>
<!-- <img
class="contact-img"
src="http://www.lixia.gov.cn/picture/0/s_97b76c734a6f40f8abba95615cbff1e1.jpg"
alt=""
/> -->
<view class="contact-detail-container">
<view class="contact-name">{{ cItem.zh_title }}</view>
<view class="contact-address">{{ cItem.address }}</view>
<!-- <view class="contact-phone">{{ item.phone }}</view> -->
</view>
</view>
</view>
</scroll-view>
<!-- 右侧字母导航条 -->
<view class="letter-nav">
<view
class="item"
:class="{ active: toView === item }"
v-for="(item, index) in indexList"
:key="index"
@click="toSelectIndex(item)"
>{{ item }}</view
>
</view>
</view>
</view>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean;
}>();
const emit = defineEmits(["handleDialog"]);
const handleClose = () => {
emit("handleDialog", false);
};
const keyword = ref()
const indexList = [
"A",
"B",
"C",
"D",
"E",
"F",
"G",
"H",
"I",
"J",
"K",
"L",
"M",
"N",
"O",
"P",
"Q",
"R",
"S",
"T",
"U",
"V",
"W",
"X",
"Y",
"Z",
];
const toView = ref("");
const addressBook = [
{
id: "A",
data: [
{
zh_title: "阿联酋迪拉姆",
en_title: "aa",
address: "910289591",
phone: "111111",
},
{
zh_title: "阿尔巴尼亚列克",
en_title: "aaaaa",
address: "ALL",
phone: "222222",
},
],
},
{
id: "B",
data: [
{
zh_title: "孟加拉国塔卡",
en_title: "bbb",
address: "BDT",
phone: "111111",
},
{
zh_title: "保加利亚列瓦",
en_title: "bbb",
address: "BGN",
phone: "222222",
},
],
},
{
id: "C",
data: [
{
zh_title: "加拿大元",
en_title: "ccc",
address: "CAD",
phone: "111111",
},
{
zh_title: "瑞士法郎",
en_title: "ccc",
address: "CHF",
phone: "222222",
},
],
},
{
id: "D",
data: [
{
zh_title: "丹麦克朗",
en_title: "ddd",
address: "DKK",
phone: "111111",
},
{
zh_title: "多米尼加比索",
en_title: "ddd",
address: "DOP",
phone: "222222",
},
{
zh_title: "丹麦克朗",
en_title: "ddd",
address: "DKK",
phone: "111111",
},
{
zh_title: "多米尼加比索",
en_title: "ddd",
address: "DOP",
phone: "222222",
},
{
zh_title: "丹麦克朗",
en_title: "ddd",
address: "DKK",
phone: "111111",
},
{
zh_title: "多米尼加比索",
en_title: "ddd",
address: "DOP",
phone: "222222",
},
],
},
{
id: "Z",
data: [
{ zh_title: "z", en_title: "zz", address: "zzz", phone: "111111" },
{ zh_title: "zzz", en_title: "ddd", address: "ddd", phone: "222222" },
],
},
];
const toSelectIndex = (item: any) => {
toView.value = item;
};
</script>
<style lang="scss" scoped>
.c-dialog-filter {
width: 95vw;
padding: 25rpx;
.title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
text-align: center;
}
.search {
margin: 30rpx 0px;
}
}
.dialog-product-layout {
height: 80vh;
.address-book-container {
height: 100%;
}
.address-book-index {
font-size: 24rpx;
}
.contact-img {
width: 20px;
height: 20px;
}
.scroll-container {
height: 100%;
}
.letter-nav {
position: fixed;
right: 25rpx;
top: 100px;
font-size: 22rpx;
text-align: center;
.item:hover,
.active {
color: $u-primary;
}
}
.contact-container {
display: flex;
align-items: center;
margin: 2%;
}
.contact-detail-container {
display: flex;
align-items: center;
justify-content: space-between;
width: 80%;
font-size: 22rpx;
.contact-address {
color: rgba(0,0,0,0.65);
}
}
}
</style>

View File

@ -0,0 +1,96 @@
<template>
<u-popup :show="show" mode="bottom" :closeable="true" @close="handleClose">
<view class="c-dialog">
<view class="box"><text>常用时间选择</text></view>
<view class="box-btn"
><text class="active">今日</text><text>昨日</text><text>本月</text
><text>本年</text></view
>
<view class="box box-border"
><text>其它时间选择</text
><text class="btn" @click="showCalendar = true">自定义</text></view
>
<view v-if="showCalendar">
<view class="line"></view>
<view class="box">
<text @click="showCalendar = false">取消</text>
<text class="btn" @click="showCalendar = false">完成</text>
</view>
<uni-calendar
:insert="true"
:lunar="true"
:start-date="'2014-1-1'"
:end-date="'2099-1-1'"
:range="true"
@change="handleChangeDate"
/>
</view>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean,
}>()
const emit = defineEmits(['handleDialog']);
const handleClose = () => {
emit('handleDialog', false)
}
const showCalendar = ref(false)
const handleChangeDate = (v: any) => {
console.log(v);
};
</script>
<style lang="scss" scoped>
::v-deep .u-popup__content {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 32rpx 32rpx 0rpx 0rpx;
}
.c-dialog {
margin: 65.38rpx 44.87rpx;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 24rpx;
color: #000000;
.box-btn,
.box {
line-height: 80rpx;
display: flex;
justify-content: space-between;
}
.box-btn {
line-height: 40rpx;
margin-bottom: 30rpx;
text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
width: 117rpx;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn {
font-weight: 500;
font-size: 24rpx;
color: $u-primary;
}
.box-border {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
.line {
height: 18rpx;
background: #f8f8f8;
}
}
</style>

View File

@ -0,0 +1,85 @@
<template>
<u-popup :show="show" mode="bottom" :closeable="false" @close="handleClose">
<view class="c-dialog">
<view>
<view class="box">
<text @click="handleClose">取消</text>
<text class="btn" @click="handleClose">完成</text>
</view>
<uni-calendar
:insert="true"
:lunar="true"
:start-date="'2014-1-1'"
:end-date="'2099-1-1'"
:range="true"
@change="handleChangeDate"
/>
</view>
</view>
</u-popup>
</template>
<script setup lang="ts">
const props = defineProps<{
show: boolean,
}>()
const emit = defineEmits(['handleDialog']);
const handleClose = () => {
emit('handleDialog', false)
}
const showCalendar = ref(false)
const handleChangeDate = (v: any) => {
console.log(v);
};
</script>
<style lang="scss" scoped>
::v-deep .u-popup__content {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 32rpx 32rpx 0rpx 0rpx;
}
.c-dialog {
margin: 30rpx;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 24rpx;
color: #000000;
.box-btn,
.box {
line-height: 80rpx;
display: flex;
justify-content: space-between;
}
.box-btn {
line-height: 40rpx;
margin-bottom: 30rpx;
text {
font-weight: 400;
font-size: 24rpx;
color: #999999;
width: 117rpx;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn {
font-weight: 500;
font-size: 24rpx;
color: $u-primary;
}
.box-border {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
.line {
height: 18rpx;
background: #f8f8f8;
}
}
</style>

View File

@ -0,0 +1,54 @@
<template>
<view class="c-card">
<view v-for="item in 10" :key="item" @click="getDetail()">
<view class="bill">
<view>收货单号CHD2024012212314</view>
<view>应收金额<text class="num">¥1800.00</text></view>
</view>
<view class="time"> 2024-01-22 14:28:36 </view>
</view>
</view>
</template>
<script setup lang="ts">
const getDetail = () => {
uni.navigateTo({
url: "/pages/statistics/customer/detail", //
});
}
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 20rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
> view {
display: flex;
align-items: baseline;
justify-content: space-between;
padding: 15rpx 0rpx;
.num {
color: rgba(236, 15, 62, 1);
}
.bill {
view {
line-height: 40rpx;
}
}
.time {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #999999;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
</style>

View File

@ -0,0 +1,222 @@
<template>
<view class="c-card">
<view class="top">
<view class="left">
<view>上海奉贤两网融合大磅</view>
<view>重一</view>
</view>
<view>
<text class="btn" @click="handleScenePhoto()">现场照片</text>
</view>
</view>
<view class="content">
<view class="baseinfo">
<view class="time"> 过磅时间2023-09-01 13:23:33 </view>
<view class="person">
<view>定价人谭兵</view>
<view>审核人谭兵</view>
</view>
</view>
<view style="padding: 30rpx 0rpx">
<view> <text>收货单号</text><text> SHD20230901132333 </text></view>
<view class="box">
<view v-for="(item, index) in gridList1" :key="index">
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
<view class="moreInfo">
<view class="baseinfo">
<view>客户收货</view>
<view class="time"> 收货时间2023-09-01 13:23:33 </view>
</view>
<view class="box">
<view v-for="(item, index) in gridList2" :key="index">
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import { reactive } from "vue";
const gridList1 = reactive([
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
]);
const gridList2 = reactive([
{
name: "结算重量",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "结算单价",
num: "2.48",
unit: "元/KG",
isBefore: false,
},
{
name: "预估总价",
num: "1587.00",
unit: "元",
isBefore: false,
},
{
name: "货款金额",
num: "1587.00",
unit: "元",
isBefore: false,
},
{
name: "杂费",
num: "0",
unit: "元",
isBefore: false,
},
{
name: "运费",
num: "0",
unit: "元",
isBefore: false,
},
{
name: "实际收入",
num: "1587.00",
unit: "元",
isBefore: false,
},
{},
{
name: "净重误差",
num: "0.00",
unit: "KG",
isBefore: false,
},
{},
{
name: "结算状态",
num: "未结算",
unit: "",
isBefore: false,
},
{
name: "应收金额",
num: "1587.00",
unit: "元",
isBefore: false,
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
.top {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 18rpx solid #f8f8f8;
.left {
view {
line-height: 40rpx;
&:nth-child(2) {
color: rgba(236, 15, 62, 1);
font-weight: 400;
font-size: 27rpx;
}
}
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.content {
margin: 30rpx;
.baseinfo {
.time {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #999999;
line-height: 40rpx;
}
.person {
display: flex;
justify-content: space-between;
font-weight: 400;
font-size: 24rpx;
color: #999999;
line-height: 40rpx;
}
}
.box {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
> view {
line-height: 50rpx;
}
}
.moreInfo {
margin-top: 20rpx;
padding: 20rpx 0rpx;
border-top: 18rpx solid rgba(248, 248, 248, 1);
.box {
margin-top: 20rpx;
}
}
}
}
</style>

View File

@ -0,0 +1,64 @@
<template>
<Search :name="'客户名称'" />
<view class="c-card">
<StatisticCard :list="list" />
<view class="detail">
<view v-for="(item, index) in 10" :key="index" @click="getDetail(item)">
<text>张小明{{ item }}</text>
<text class="num">¥1800.00 <text class="tip"></text></text>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import Search from "@/components/Search/index.vue";
import StatisticCard from "@/components/StatisticCard/index.vue";
const list = reactive([
{
num: 2,
name: "欠款客户",
},
{
num: 8923,
name: "欠款金额",
},
]);
const getDetail = (item: any) => {
uni.navigateTo({
url: "/pages/statistics/customer/billDetail", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 30rpx 25rpx;
}
.detail {
border-top: 18rpx solid #f8f8f8;
padding: 20rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
> view {
display: flex;
justify-content: space-between;
padding: 20rpx 10rpx;
.num {
color: #EC0F3E;
}
.tip {
color: $u-primary;
margin-left: 20rpx;
font-weight: 500;
font-size: 24rpx;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<view class="layout-box">
<view class="filter">
<u-input
v-model="params.startTime"
disabled
disabledColor="#ffffff"
placeholder="请选择开始时间"
></u-input>
<text>-</text>
<u-input
v-model="params.endTime"
disabled
disabledColor="#ffffff"
placeholder="请选择结束时间"
></u-input>
<u-icon
name="arrow-down-fill"
@click="handleDialog('showTime', true)"
></u-icon>
<text class="btn" @click="handleDialog('showFilter', true)"
>出货产品</text
>
</view>
</view>
<c-echarts :option="option" :height="'90vh'" />
<!-- 单据弹框 -->
<ProductTypeDialog :show="showDialog.showFilter" @handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"/>
</template>
<script setup lang="ts">
import CEcharts from "../../components/Echarts/echarts.vue";
import ProductTypeDialog from './components/ProductTypeDialog.vue'
const option = ref({
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
},
},
grid: {
left: "10px",
right: "20px",
top: "10px",
bottom: "30px",
containLabel: true,
},
xAxis: {
type: "value",
boundaryGap: [0, 0.01],
},
yAxis: {
type: "category",
data: [1, 2, 3, 4, 5],
axisLabel: {
// inside: true,
// color: '#fff'
},
axisTick: {
show: false,
},
axisLine: {
show: true,
lineStyle: {
color: "#83bff6",
},
},
},
series: [
{
data: [100, 110, 113, 126, 143, 158, 165, 167, 152, 102, ,],
type: "bar",
areaStyle: {
show: true,
},
barWidth: 24,
},
],
color: ["#00D2E3"],
});
const params = reactive({
startTime: "2024-01-01",
endTime: "2024-01-01",
});
const showDialog = <
{
[key: string]: boolean;
}
>reactive({
showTime: false,
showFilter: false,
});
const handleDialog = (key: string, v: boolean) => {
showDialog[key] = v;
};
</script>
<style lang="scss" scoped>
.layout-box {
margin: 35.9rpx 25.64rpx;
.filter {
display: flex;
align-items: center;
justify-items: center;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 27rpx;
color: #000000;
::v-deep .u-input {
padding: 0rpx 16.03rpx !important;
input {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx !important;
color: #000000;
}
}
text {
margin: 0px 5rpx;
}
.status {
margin-left: 40rpx;
}
.btn {
color: $u-primary;
margin-left: 40rpx;
margin-right: 0rpx;
}
}
}
</style>

View File

@ -0,0 +1,166 @@
<template>
<Box>
<view v-for="(item, index) in list" :key="index">
<view class="title">
<Title :title="item.title" />
</view>
<view class="box-content">
<view v-for="(child, index) in item.child" :key="index" @click="(child as any).fn(child)">
<view>
<up-image
:src="`/static/img/statistic/${child.icon}`"
:width="child.width"
:height="child.height"
mode="aspectFill"
></up-image>
</view>
<view>{{ child.title }}</view>
</view>
</view>
<view class="line" v-show="index < list.length -1"></view>
</view>
</Box>
</template>
<script setup lang="ts">
import Box from "../../components/Box/index.vue";
import Title from "../../components/Title/index.vue";
const list = reactive([
{
title: "收货",
child: [
{
icon: "1-1.png",
width: "42.31rpx",
height: "50rpx",
title: "收货汇总",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/receivePanel", //
})
}
},
{
icon: "1-2.png",
width: "44.23rpx",
height: "44.23rpx",
title: "供应商排行",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/supplierRanking", //
})
}
},
],
},
{
title: "出货",
child: [
{
icon: "2-1.png",
width: "42.31rpx",
height: "50rpx",
title: "出货汇总",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/shipmentPanel", //
})
}
},
{
icon: "2-2.png",
width: "46.15rpx",
height: "46.15rpx",
title: "客户排行",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/customerRanking", //
})
}
},
],
},
{
title: "账本",
child: [
{
icon: "3-1.png",
width: "46.15rpx",
height: "46.79rpx",
title: "经营概况",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/businessOverview", //
})
}
},
{
icon: "3-2.png",
width: "48.08rpx",
height: "44.23rpx",
title: "供应商对账",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/supplierChecking", //
})
}
},
{
icon: "3-3.png",
width: "43.59rpx",
height: "43.59rpx",
title: "客户对账",
fn: (item: any) => {
uni.navigateTo({
url: "/pages/statistics/customerChecking", //
})
}
},
],
},
]);
</script>
<style lang="scss" scoped>
.title {
line-height: 80rpx;
padding: 0rpx 19.87rpx;
}
.box-content {
display: flex;
margin: 21rpx 0rpx;
padding: 0rpx 19.87rpx;
> view {
width: 141rpx;
height: 141rpx;
background: #f9f9f9;
border-radius: 26rpx;
// text-align: center;
// vertical-align: middle;
// display: grid;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
display: flex;
align-items: center;
justify-content: space-evenly;
flex-direction: column;
> view {
display: grid;
place-content: center;
width: 100%;
}
}
> view + view {
margin-left: 32.05rpx;
}
::v-deep .u-transition {
align-items: center;
}
}
.line {
height: 18rpx;
background: #f8f8f8;
}
</style>

View File

@ -0,0 +1,236 @@
<template>
<view class="layout-box">
<view class="filter">
<u-input
v-model="params.startTime"
disabled
disabledColor="#ffffff"
placeholder="请选择开始时间"
></u-input>
<text>-</text>
<u-input
v-model="params.endTime"
disabled
disabledColor="#ffffff"
placeholder="请选择结束时间"
></u-input>
<u-icon name="arrow-down-fill" @click="handleDialog('showTime',true)"></u-icon>
<text class="status">单据状态</text>
<u-icon name="arrow-down-fill" @click="handleDialog('showStatus', true)"></u-icon>
<text class="btn" @click="handleDialog('showFilter', true)">筛选</text>
</view>
<view class="box">
<up-row>
<up-col span="4">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>收货总量/kg</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>已付/kg</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>未付/kg</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<up-row>
<up-col span="4">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>结算金额/</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>实收金额</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>应付金额</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<up-row>
<up-col span="6">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>收货单</view>
</view>
</up-col>
<up-col span="6">
<view class="inner-box">
<view class="num">892339.9</view>
<view>均价/kg</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<uni-table stripe emptyText="暂无更多数据">
<!-- 表头行 -->
<uni-tr>
<uni-th v-for="(item, index) in tableTitleList" :key="index">{{
item.name
}}</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr v-for="(item, index) in 10" :key="index">
<uni-td>轻一</uni-td>
<uni-td>1636.00</uni-td>
<uni-td>5646.00</uni-td>
<uni-td>5636.00</uni-td>
<uni-td>5636.00</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
<!-- 时间弹框 -->
<TimeDialog ref="timeDialog" :show="showDialog.showTime" @handleDialog="(v:boolean) => {handleDialog('showTime', v)}"/>
<!-- 单据弹框 -->
<StatusDialog :show="showDialog.showStatus" @handleDialog="(v:boolean) => {handleDialog('showStatus', v)}"/>
<!-- 筛选弹框 -->
<FilterDialog :show="showDialog.showFilter" @handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"/>
</template>
<script setup lang="ts">
import TimeDialog from './components/TimeDialog.vue'
import StatusDialog from './components/StatusDialog.vue'
import FilterDialog from './components/FilterDialog.vue'
const params = reactive({
startTime: "2024-01-01",
endTime: "2024-01-01",
});
const tableTitleList = reactive([
{
name: "收货产品",
},
{
name: "收货总量/kg",
},
{
name: "总金额",
},
{
name: "收货单数",
},
{
name: "均价(元/kg",
},
]);
const showDialog = <
{
[key: string]: boolean
}
>reactive(
{
showTime: false,
showStatus: false,
showFilter: false
}
)
const handleDialog = (key: string, v:boolean) => {
showDialog[key] = v
}
</script>
<style lang="scss" scoped>
.layout-box {
margin: 35.9rpx 25.64rpx;
.filter {
display: flex;
align-items: center;
justify-items: center;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 27rpx;
color: #000000;
::v-deep .u-input {
padding: 0rpx 16.03rpx !important;
input {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx !important;
color: #000000;
}
}
text {
margin: 0px 5rpx;
}
.status {
margin-left: 40rpx;
}
.btn {
color: $u-primary;
margin-left: 40rpx;
margin-right: 0rpx;
}
}
.box {
padding: 19.23rpx;
// display: flex;
// justify-content: space-between;
align-items: center;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
text-align: center;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin-top: 30rpx;
}
.inner-box {
text-align: center;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
border-left: 1px solid #e9e9e9;
.num {
font-weight: bold;
font-size: 27rpx;
}
}
::v-deep .uni-table {
min-width: auto !important;
.uni-table-th {
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 22rpx;
color: #000000;
padding: 5px 5px;
}
.uni-table-td {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
}
}
</style>

View File

@ -0,0 +1,236 @@
<template>
<view class="layout-box">
<view class="filter">
<u-input
v-model="params.startTime"
disabled
disabledColor="#ffffff"
placeholder="请选择开始时间"
></u-input>
<text>-</text>
<u-input
v-model="params.endTime"
disabled
disabledColor="#ffffff"
placeholder="请选择结束时间"
></u-input>
<u-icon name="arrow-down-fill" @click="handleDialog('showTime',true)"></u-icon>
<text class="status">单据状态</text>
<u-icon name="arrow-down-fill" @click="handleDialog('showStatus', true)"></u-icon>
<text class="btn" @click="handleDialog('showFilter', true)">筛选</text>
</view>
<view class="box">
<up-row>
<up-col span="4">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>出货总量/kg</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>已收/kg</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>未收/kg</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<up-row>
<up-col span="4">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>结算金额/kg</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>实收金额</view>
</view>
</up-col>
<up-col span="4">
<view class="inner-box">
<view class="num">892339.9</view>
<view>应收金额</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<up-row>
<up-col span="6">
<view class="inner-box" style="border: none">
<view class="num">892339.9</view>
<view>出货单</view>
</view>
</up-col>
<up-col span="6">
<view class="inner-box">
<view class="num">892339.9</view>
<view>均价(/kg)</view>
</view>
</up-col>
</up-row>
</view>
<view class="box">
<uni-table stripe emptyText="暂无更多数据">
<!-- 表头行 -->
<uni-tr>
<uni-th align="center" v-for="(item, index) in tableTitleList" :key="index">{{
item.name
}}</uni-th>
</uni-tr>
<!-- 表格数据行 -->
<uni-tr v-for="(item, index) in 10" :key="index">
<uni-td>张家港华仁再生</uni-td>
<uni-td>1636.00</uni-td>
<uni-td>5646.00</uni-td>
<uni-td>5636.00</uni-td>
<uni-td>5636.00</uni-td>
</uni-tr>
</uni-table>
</view>
</view>
<!-- 时间弹框 -->
<TimeDialog ref="timeDialog" :show="showDialog.showTime" @handleDialog="(v:boolean) => {handleDialog('showTime', v)}"/>
<!-- 单据弹框 -->
<StatusDialog :show="showDialog.showStatus" @handleDialog="(v:boolean) => {handleDialog('showStatus', v)}"/>
<!-- 筛选弹框 -->
<FilterDialog :show="showDialog.showFilter" @handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"/>
</template>
<script setup lang="ts">
import TimeDialog from './components/TimeDialog.vue'
import StatusDialog from './components/StatusDialog.vue'
import FilterDialog from './components/FilterDialog.vue'
const params = reactive({
startTime: "2024-01-01",
endTime: "2024-01-01",
});
const tableTitleList = reactive([
{
name: "客户",
},
{
name: "结算重量",
},
{
name: "结算金额",
},
{
name: "实收款",
},
{
name: "数量",
},
]);
const showDialog = <
{
[key: string]: boolean
}
>reactive(
{
showTime: false,
showStatus: false,
showFilter: false
}
)
const handleDialog = (key: string, v:boolean) => {
showDialog[key] = v
}
</script>
<style lang="scss" scoped>
.layout-box {
margin: 35.9rpx 25.64rpx;
.filter {
display: flex;
align-items: center;
justify-items: center;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 27rpx;
color: #000000;
::v-deep .u-input {
padding: 0rpx 16.03rpx !important;
input {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx !important;
color: #000000;
}
}
text {
margin: 0px 5rpx;
}
.status {
margin-left: 40rpx;
}
.btn {
color: $u-primary;
margin-left: 40rpx;
margin-right: 0rpx;
}
}
.box {
padding: 19.23rpx;
// display: flex;
// justify-content: space-between;
align-items: center;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
text-align: center;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin-top: 30rpx;
}
.inner-box {
text-align: center;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
border-left: 1px solid #e9e9e9;
.num {
font-weight: bold;
font-size: 27rpx;
}
}
::v-deep .uni-table {
min-width: auto !important;
.uni-table-th {
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 22rpx;
color: #000000;
padding: 5px 5px;
}
.uni-table-td {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
}
}
}
</style>

View File

@ -0,0 +1,54 @@
<template>
<view class="c-card">
<view v-for="item in 10" :key="item" @click="getDetail()">
<view class="bill">
<view>收货单号CHD2024012212314</view>
<view>应付金额<text class="num">¥1800.00</text></view>
</view>
<view class="time"> 2024-01-22 14:28:36 </view>
</view>
</view>
</template>
<script setup lang="ts">
const getDetail = () => {
uni.navigateTo({
url: "/pages/statistics/supplier/detail", //
});
}
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
padding: 20rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
> view {
display: flex;
align-items: baseline;
justify-content: space-between;
padding: 15rpx 0rpx;
.num {
color: rgba(236, 15, 62, 1);
}
.bill {
view {
line-height: 40rpx;
}
}
.time {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #999999;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
</style>

View File

@ -0,0 +1,169 @@
<template>
<view class="c-card">
<view class="top">
<view class="left">
<view>上海奉贤两网融合大磅</view>
<view>重一</view>
</view>
<view>
<text class="btn" @click="handleScenePhoto()">现场照片</text>
</view>
</view>
<view class="content">
<view class="baseinfo">
<view class="time"> 过磅时间2023-09-01 13:23:33 </view>
<view class="person">
<view>定价人谭兵</view>
<view>审核人谭兵</view>
</view>
</view>
<view style="padding: 30rpx 0rpx">
<view> <text>收货单号</text><text> SHD20230901132333 </text></view>
<view class="box">
<view v-for="(item, index) in gridList1" :key="index">
<text v-if="item.name">{{ item.name }}</text
><text
>{{ item.isBefore ? item.unit : "" }}
{{ item.num }}
{{ item.isBefore ? "" : item.unit }}
</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup lang="ts">
const gridList1 = reactive([
{
name: "毛重",
num: "4080.00",
unit: "KG",
isBefore: false,
},
{
name: "皮重",
num: "3450.00",
unit: "KG",
isBefore: false,
},
{
name: "扣杂",
num: "0.00",
unit: "KG",
isBefore: false,
},
{
name: "",
num: "",
unit: "",
},
{
name: "净重",
num: "640.00",
unit: "KG",
isBefore: false,
},
{
name: "单价",
num: "2.48",
unit: "元/kg",
isBefore: false,
},
{
name: "预估总价",
num: "1587.00",
unit: "元",
isBefore: false,
},
{
name: "货款金额",
num: "1587.00",
unit: "元",
isBefore: false,
},
{
name: "付款状态",
num: "未支付",
isBefore: false,
},
{
name: "应付金额",
num: "1587.00",
unit: "元",
isBefore: false,
},
]);
const handleScenePhoto = () => {
uni.navigateTo({
url: "/pages/scenePhoto/index", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
margin: 30rpx 25rpx;
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 24rpx;
color: #000000;
.top {
display: flex;
justify-content: space-between;
align-items: center;
padding: 30rpx;
border-bottom: 18rpx solid #f8f8f8;
.left {
view {
line-height: 40rpx;
&:nth-child(2) {
color: rgba(236, 15, 62, 1);
font-weight: 400;
font-size: 27rpx;
}
}
}
.btn {
border-radius: 24rpx;
border: 1px solid #00dcee;
padding: 10rpx 30rpx;
font-weight: 500;
font-size: 24rpx;
color: #00dcee;
line-height: 41rpx;
}
}
.content {
margin: 30rpx;
.baseinfo {
.time {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #999999;
line-height: 40rpx;
}
.person {
display: flex;
justify-content: space-between;
font-weight: 400;
font-size: 24rpx;
color: #999999;
line-height: 40rpx;
}
}
.box {
display: grid;
grid-template-columns: repeat(2, 1fr);
flex: 1;
> view {
line-height: 50rpx;
}
}
}
}
</style>

View File

@ -0,0 +1,64 @@
<template>
<Search :name="'供应商名称'" />
<view class="c-card">
<StatisticCard :list="list" />
<view class="detail">
<view v-for="(item, index) in 10" :key="index" @click="getDetail(item)">
<text>华明基地{{ item }}</text>
<text class="num">¥1800.00 <text class="tip"></text></text>
</view>
</view>
</view>
</template>
<script setup lang="ts">
import Search from "@/components/Search/index.vue";
import StatisticCard from "@/components/StatisticCard/index.vue";
const list = reactive([
{
num: 2,
name: "应付供应商",
},
{
num: 8923,
name: "应付金额",
},
]);
const getDetail = (item: any) => {
uni.navigateTo({
url: "/pages/statistics/supplier/billDetail", //
});
};
</script>
<style lang="scss" scoped>
.c-card {
background: #ffffff;
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 30rpx 25rpx;
}
.detail {
border-top: 18rpx solid #f8f8f8;
padding: 20rpx;
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx;
color: #000000;
> view {
display: flex;
justify-content: space-between;
padding: 20rpx 10rpx;
.num {
color: #ec0f3e;
}
.tip {
color: $u-primary;
margin-left: 20rpx;
font-weight: 500;
font-size: 24rpx;
}
}
> view + view {
border-top: 1px solid rgba(233, 233, 233, 0.76);
}
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<view class="layout-box">
<view class="filter">
<u-input
v-model="params.startTime"
disabled
disabledColor="#ffffff"
placeholder="请选择开始时间"
></u-input>
<text>-</text>
<u-input
v-model="params.endTime"
disabled
disabledColor="#ffffff"
placeholder="请选择结束时间"
></u-input>
<u-icon
name="arrow-down-fill"
@click="handleDialog('showTime', true)"
></u-icon>
<text class="btn" @click="handleDialog('showFilter', true)"
>收货产品</text
>
</view>
</view>
<c-echarts :option="option" :height="'90vh'" />
<!-- 单据弹框 -->
<ProductTypeDialog :show="showDialog.showFilter" @handleDialog="(v:boolean) => {handleDialog('showFilter', v)}"/>
</template>
<script setup lang="ts">
import CEcharts from "../../components/Echarts/echarts.vue";
import ProductTypeDialog from './components/ProductTypeDialog.vue'
const option = ref({
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
},
},
grid: {
left: "10px",
right: "20px",
top: "10px",
bottom: "30px",
containLabel: true,
},
xAxis: {
type: "value",
boundaryGap: [0, 0.01],
},
yAxis: {
type: "category",
data: [1, 2, 3, 4, 5],
axisLabel: {
// inside: true,
// color: '#fff'
},
axisTick: {
show: false,
},
axisLine: {
show: true,
lineStyle: {
color: "#83bff6",
},
},
},
series: [
{
data: [100, 110, 113, 126, 143, 158, 165, 167, 152, 102, ,],
type: "bar",
areaStyle: {
show: true,
},
barWidth: 24,
},
],
color: ["#00D2E3"],
});
const params = reactive({
startTime: "2024-01-01",
endTime: "2024-01-01",
});
const showDialog = <
{
[key: string]: boolean;
}
>reactive({
showTime: false,
showFilter: false,
});
const handleDialog = (key: string, v: boolean) => {
showDialog[key] = v;
};
</script>
<style lang="scss" scoped>
.layout-box {
margin: 35.9rpx 25.64rpx;
.filter {
display: flex;
align-items: center;
justify-items: center;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 27rpx;
color: #000000;
::v-deep .u-input {
padding: 0rpx 16.03rpx !important;
input {
font-family: Source Han Sans CN;
font-weight: 400;
font-size: 21rpx !important;
color: #000000;
}
}
text {
margin: 0px 5rpx;
}
.status {
margin-left: 40rpx;
}
.btn {
color: $u-primary;
margin-left: 40rpx;
margin-right: 0rpx;
}
}
}
</style>

48
src/services/demo.ts Normal file
View File

@ -0,0 +1,48 @@
// 存放路径: src/services/home.ts
import { http } from '@/utils/http'
/**
* -广-
* @param distributionSite 广 12 1
*/
export const getHomeBannerAPI = (distributionSite = 1) => {
return http({
method: 'GET',
url: '/home/banner',
data: {
distributionSite,
},
})
}
// services/home.ts
/**
* --
*/
export const getHomeCategoryAPI = () => {
return http({
method: 'GET',
url: '/home/category/mutli',
})
}
// services/home.ts
/**
* --
*/
export const getHomeHotAPI = () => {
return http({
method: 'GET',
url: '/home/hot/mutli',
})
}
// src/services/home.ts
/**
* -
*/
export const getHomeGoodsGuessLikeAPI = (data: any) => {
return http({
method: 'GET',
url: '/home/goods/guessLike',
data,
})
}

3
src/services/index.ts Normal file
View File

@ -0,0 +1,3 @@
export * as ProfileApi from './profile'
export * as ReceiveApi from './receive'
export * as ShipmentApi from './shipment'

96
src/services/profile.ts Normal file
View File

@ -0,0 +1,96 @@
// 存放路径: src/services/home.ts
import { http } from "@/utils/http";
// 登陆
export const loginByAccount = (data: {
userName: string;
password: string;
}) => {
return http({
method: "POST",
url: "/api/user/login",
data,
});
};
// 登陆
export const logOut = () => {
return http({
method: "POST",
url: "/api/user/logOut",
});
};
// 验证码登录
export const loginPhone = (data: { phone: string; code: string }) => {
return http({
method: "GET",
url: "/api/user/loginPhone",
data,
});
};
// 发送验证码
export const sendMsg = (data: { phone: string }) => {
return http({
method: "GET",
url: "/api/user/sendMsg",
data,
});
};
// 创建角色
export const addRole = (data: { roleCode: string; roleName: string }) => {
return http({
method: "POST",
url: "/api/role/addRole",
data,
});
};
// 修改角色
export const updateRole = (data: {
id: string;
roleCode: string;
roleName: string;
isDeleted: string;
}) => {
return http({
method: "POST",
url: "/api/role/updateRole",
data,
});
};
// 发送验证码
export const getRoleList = () => {
return http({
method: "GET",
url: "/api/role/getRoleList",
});
};
// 验证角色是否重复 1=code 2=名称 3=全部
export const verifyRole = (data: {
roleCode: string;
roleName: string;
type: string;
}) => {
return http({
method: "GET",
url: "/api/role/verifyRole",
data,
});
};
// 添加角色菜单权限
export const addMenusRole = (data: {
id: number;
list: {
menusId: number;
state: number; // 状态1=开启0=关闭
}[];
}) => {
return http({
method: "POST",
url: "/api/role/addMenusRole",
data,
});
};

128
src/services/receive.ts Normal file
View File

@ -0,0 +1,128 @@
// 存放路径: src/services/home.ts
import type { Result } from '@/types/global'
import { http } from "@/utils/http";
type PageParams = {
pageNumber: number,
pageSize: number,
pricingUserId?: string, // 定价人
userId?: string, // 供应商id
productId?: string, // 产品id
repairFlag?: boolean, // 是否为补单,true 是未补单false是补单
scaleStatus?: number, // 磅单状态:0待定价1待过皮2待审核3已审核待支付4已支付
}
interface ReceiveOrderPage<T> {
total: number,
list: T,
pageNum: number,
pageSize: number
}
type ReceiveOrder = {
id: number,
deviceId: number, // 设备id
deviceName: string, // 设备名称
userId: number, // 用户id
cardId: number, //库存卡id
cardNumber: number, // 库存卡号
userName: string, // 用户名称:关联用户表得到
productId: number, // 品类id
productName: string, // 品类名称:关联品类表得到
imagesId: string,
imageUrls: string,
carNumber: string, // 车牌号
receiptNumber: string, // 收货单号
grossWeight: number, // 毛重
tare: number, // 皮重
grossTime: string, // 过毛日期
tareTime: string, // 过皮日期
netWeight: string, // 净重(净重=净重*1-扣点)-扣杂)
buttonType: string, // 扣杂状态0扣杂1扣点
points: string, // 扣点
buckleMiscellaneous: string, //扣杂
price: string, // 单价
balanceTotalPrice: string, //结算总价
totalPrice: string, //实际总价
weighingMethod: string, //称重方式0有皮重 1零皮重
multiCategory: string, // 多品类0单品类 1多品类
}
// 收库单分页查询
export const getOrderPage = (data: PageParams) => {
return http<ReceiveOrderPage<ReceiveOrder>>({
method: "GET",
url: "/api/orderIn/getOrderPage",
data,
});
};
// 获取收货单集合
export const getList = () => {
return http<Result>({
method: "GET",
url: "/api/orderIn/getList"
});
};
//根据id获取收货单详情
export const getDetailById = (data: {id: number}) => {
return http<Result>({
method: "GET",
url: "/api/orderIn/getOne",
data
});
};
// 新增收货单
export const addOrderIn = (data: any) => {
return http<Result>({
method: "POST",
url: "/api/orderIn/addOrderIn",
data,
});
};
// 批量修改收货单
export const updateOrderIn = (data: any) => {
return http<Result>({
method: "POST",
url: "/api/orderIn/updateOrderIn",
data,
});
};
// 用于过皮和零皮重
export const getTare = (data: any) => {
return http<Result>({
method: "POST",
url: "/api/orderIn/getTare",
data,
});
};
// 用于单个或批量作废收货单
export const deleteOrder = (data: any) => {
return http<Result>({
method: "POST",
url: "/api/orderIn/delete",
data,
});
};
// 统计首页的本月总收获以及总支出
// 收货类型
type ReceiveSummary = {
totalReceipt: number, // 本月总出货
totalExpenditure: number, // 本月总收入
toBePriced: number, // 待收货
toBeTare: number, // 待过皮重
audit: number, // 付款审核
toBePaid: number, // 待支付
}
export const countOrderByMonth = () => {
return http<ReceiveSummary>({
method: "GET",
url: "/api/orderIn/countOrderByMonth"
});
};

18
src/services/shipment.ts Normal file
View File

@ -0,0 +1,18 @@
import { http } from '@/utils/http'
type ShipmentSummary = {
totalShipment: number, // 总出货
totalIncome: number, // 出货总收入
toBeShipped: number, // 待出货
roughWeight: number, // 待过毛重
shipmentReview: number, // 出货结算
toBeSettled: number, // 待结算
}
// 统计首页的本月收入以及待出库
export const countOrderByMonth = () => {
return http<ShipmentSummary>({
method: "GET",
url: "/api/orderOut/countOrderByMonth"
});
};

6
src/shime-uni.d.ts vendored Normal file
View File

@ -0,0 +1,6 @@
export {}
declare module "vue" {
type Hooks = App.AppInstance & Page.PageInstance;
interface ComponentCustomOptions extends Hooks {}
}

BIN
src/static/img/01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/static/img/02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/static/img/03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
src/static/img/04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
src/static/img/app1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
src/static/img/app2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
src/static/img/app3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
src/static/img/app4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
src/static/img/app5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
src/static/img/app6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
src/static/img/app7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
src/static/img/app8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

BIN
src/static/img/launch/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 270 KiB

BIN
src/static/img/launch/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

BIN
src/static/img/launch/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

BIN
src/static/img/launch/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

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