csxy 4 months ago
parent 7a064b0a0a
commit 228dd80da5

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

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

@ -0,0 +1,5 @@
# Vue 3 + Vite
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).

@ -0,0 +1,16 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>五组项目成本估算</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,18 @@
{
"name": "projectstory",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.4.37"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.1.2",
"vite": "^5.4.1"
}
}

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,10 @@
<script setup>
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
<HelloWorld/>
</template>
<style scoped>
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

@ -0,0 +1,107 @@
<script setup>
import { ref, onMounted } from 'vue'
defineProps({
msg: String,
})
const count = ref(0)
const draggingIndex = ref(-1)
const images = ref([
{ id: 1, x: 100, y: 400 },
{ id: 2, x: 200, y: 400 },
{ id: 3, x: 300, y: 400 },
{ id: 4, x: 400, y: 400 },
{ id: 5, x: 500, y: 400 }
])
const num = [0,1,2,3,5,8,13,"?"];
const startDrag = (index, event) => {
draggingIndex.value = index
}
const onDrag = (event) => {
if (draggingIndex.value !== -1) {
images.value[draggingIndex.value].x = event.clientX - 25
images.value[draggingIndex.value].y = event.clientY - 25
}
}
const endDrag = () => {
draggingIndex.value = -1
}
onMounted(() => {
document.addEventListener('mousemove', onDrag)
document.addEventListener('mouseup', endDrag)
})
</script>
<template>
<div>
<div class="container" @mousemove="onDrag" @mouseup="endDrag">
<h1>敏捷项目成本估算</h1>
<table>
<thead>
<td>故事点</td>
<td v-for="(value,index) in num" :key="index">{{value}}</td>
</thead>
<tbody>
<tr v-for="row in 3" :key="row">
<td>{{row}}</td>
<td v-for="col in 8" :key="col"></td>
</tr>
</tbody>
</table>
<img v-for="(image, index) in images"
:key="image.id"
:src="`/src/assets/pic/${index + 1}.png`"
class="draggable-image"
:style="{ left: image.x + 'px', top: image.y + 'px' }"
@mousedown="startDrag(index, $event)"
/>
</div>
</div>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
.container {
position: relative;
width: 100%;
height: 100vh;
}
table {
width: 100%;
border-collapse: collapse;
background-color: lightblue;
}
td {
border: 1px solid red;
height: 80px;
text-align: center;
border-left: none;
width: 11%;
}
td:first-child {
border-left: 1px solid red;
width: 12%;
}
.draggable-image {
position: absolute;
width: 60px;
height: 60px;
cursor: move;
user-select: none;
}
</style>

@ -0,0 +1,4 @@
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
})
Loading…
Cancel
Save