浏览代码

zbytest003-2025-02-18 01:59:59

genlitex 2 月之前
父节点
当前提交
af6d64166c
共有 7 个文件被更改,包括 176 次插入63 次删除
  1. 1 0
      dist/assets/Login-k0RQAMj9.js
  2. 4 0
      dist/assets/index-B5wmvqgj.js
  3. 0 0
      dist/assets/index-BDTOXUHB.css
  4. 13 0
      dist/index.html
  5. 8 2
      src/router/index.js
  6. 116 0
      src/views/Chat.vue
  7. 34 61
      src/views/Login.vue

+ 1 - 0
dist/assets/Login-k0RQAMj9.js

@@ -0,0 +1 @@
+import{_ as u,c as a,a as n,w as i,b as l,v as d,n as m,d as p,e as v,f as w,o as t}from"./index-B5wmvqgj.js";const b={data(){return{username:"admin",password:"admin123",rememberMe:!1,invalidUsername:!1,invalidPassword:!1}},methods:{handleLogin(){this.invalidUsername=this.username.length<4||this.username.length>16||!/^[a-zA-Z0-9]+$/.test(this.username),this.invalidPassword=this.password.length<6||this.password.length>20,!this.invalidUsername&&!this.invalidPassword&&(this.username==="admin"&&this.password==="admin123"?this.$router.push("/"):alert("Username or password is incorrect."))}}},h={class:"login-container"},f={key:0,class:"error-message"},g={key:1,class:"error-message"};function U(c,e,x,P,s,o){return t(),a("div",h,[e[8]||(e[8]=n("h2",null,"Login",-1)),n("form",{onSubmit:e[3]||(e[3]=w((...r)=>o.handleLogin&&o.handleLogin(...r),["prevent"]))},[e[5]||(e[5]=n("label",null,"Username:",-1)),i(n("input",{"onUpdate:modelValue":e[0]||(e[0]=r=>s.username=r),placeholder:"admin",class:m({invalid:s.invalidUsername})},null,2),[[d,s.username,void 0,{trim:!0}]]),s.invalidUsername?(t(),a("span",f,"Username must be between 4-16 characters and cannot contain special characters.")):l("",!0),e[6]||(e[6]=n("label",null,"Password:",-1)),i(n("input",{type:"password","onUpdate:modelValue":e[1]||(e[1]=r=>s.password=r),placeholder:"admin123",class:m({invalid:s.invalidPassword})},null,2),[[d,s.password,void 0,{trim:!0}]]),s.invalidPassword?(t(),a("span",g,"Password must be between 6-20 characters.")):l("",!0),n("label",null,[i(n("input",{type:"checkbox","onUpdate:modelValue":e[2]||(e[2]=r=>s.rememberMe=r)},null,512),[[v,s.rememberMe]]),e[4]||(e[4]=p(" Remember me"))]),e[7]||(e[7]=n("button",{type:"submit"},"Login",-1))],32)])}const L=u(b,[["render",U],["__scopeId","data-v-e1c28181"]]);export{L as default};

文件差异内容过多而无法显示
+ 4 - 0
dist/assets/index-B5wmvqgj.js


文件差异内容过多而无法显示
+ 0 - 0
dist/assets/index-BDTOXUHB.css


+ 13 - 0
dist/index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <title>Prototype Design</title>
+    <script type="module" crossorigin src="/ide/proxy/6003/assets/index-B5wmvqgj.js"></script>
+    <link rel="stylesheet" crossorigin href="/ide/proxy/6003/assets/index-BDTOXUHB.css">
+  </head>
+  <body>
+    <div id="app"></div>
+  </body>
+</html>

+ 8 - 2
src/router/index.js

@@ -1,17 +1,23 @@
 import { createRouter, createWebHashHistory } from 'vue-router';
 import HomeView from '../views/HomeView.vue';
 import Login from '../views/Login.vue';
+import Chat from '../views/Chat.vue';
 
 const routes = [
   {
     path: '/',
-    name: 'home',
+    name: 'Home',
     component: HomeView
   },
   {
     path: '/login',
     name: 'Login',
-    component: Login
+    component: () => import('../views/Login.vue')
+  },
+  {
+    path: '/chat',
+    name: 'Chat',
+    component: Chat
   }
 ];
 

+ 116 - 0
src/views/Chat.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="chat-container">
+    <div class="messages">
+      <div v-for="(message, index) in messages" :key="index" :class="{ 'user-message': message.fromUser, 'system-message': !message.fromUser }">
+        <strong>{{ message.fromUser ? 'You' : 'System' }}:</strong> {{ message.text }}
+      </div>
+    </div>
+    <div class="input-container">
+      <input v-model="newMessage" @keyup.enter="sendMessage" placeholder="Type a message...">
+      <button @click="sendMessage">Send</button>
+    </div>
+    <div class="file-manager">
+      <input type="file" @change="handleFileUpload">
+      <ul>
+        <li v-for="(file, index) in uploadedFiles" :key="index">
+          {{ file.name }} - {{ file.progress }}%
+          <button @click="downloadFile(file)">Download</button>
+        </li>
+      </ul>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      newMessage: '',
+      messages: [
+        { fromUser: false, text: 'Welcome to the chat!' },
+      ],
+      uploadedFiles: [],
+    };
+  },
+  methods: {
+    sendMessage() {
+      if (this.newMessage.trim()) {
+        this.messages.push({ fromUser: true, text: this.newMessage });
+        this.newMessage = '';
+      }
+    },
+    handleFileUpload(event) {
+      const file = event.target.files[0];
+      // Simulate upload progress (in a real app, you'd use an actual file upload library)
+      for (let i = 0; i <= 100; i++) {
+        setTimeout(() => {
+          this.uploadedFiles.push({
+            name: file.name,
+            progress: i,
+          });
+        }, 500 * (i / 100));
+      }
+    },
+    downloadFile(file) {
+      // Simulate download (in a real app, you'd provide a download link or handle it server-side)
+      alert(`Downloading ${file.name}`);
+    },
+  },
+};
+</script>
+
+<style scoped>
+.chat-container {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  height: 100vh;
+  width: 100%;
+}
+
+.messages {
+  width: 100%;
+  max-width: 600px;
+  padding: 1rem;
+  background-color: #f0f0f0;
+  border-radius: 8px;
+  margin-bottom: 1rem;
+}
+
+.user-message {
+  background-color: #d4eaf7;
+  border-radius: 8px;
+  margin-bottom: 0.5rem;
+}
+
+.system-message {
+  background-color: #eaf7d4;
+  border-radius: 8px;
+  margin-bottom: 0.5rem;
+}
+
+.input-container {
+  width: 100%;
+  max-width: 600px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.input-container input {
+  flex-grow: 1;
+  margin-right: 0.5rem;
+}
+
+.file-manager ul {
+  list-style-type: none;
+  padding-left: 0;
+}
+
+.file-manager li {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 0.5rem;
+}
+</style>

+ 34 - 61
src/views/Login.vue

@@ -2,13 +2,13 @@
   <div class="login-container">
     <h2>Login</h2>
     <form @submit.prevent="handleLogin">
-      <label for="username">Username:</label>
-      <input id="username" v-model.trim="username" type="text" placeholder="Enter username" :class="{ 'has-error': errors.username }">
-      <small v-if="errors.username">{{ errors.username }}</small>
+      <label>Username:</label>
+      <input v-model.trim="username" placeholder="admin" :class="{ 'invalid': invalidUsername }">
+      <span v-if="invalidUsername" class="error-message">Username must be between 4-16 characters and cannot contain special characters.</span>
 
-      <label for="password">Password:</label>
-      <input id="password" v-model.trim="password" type="password" placeholder="Enter password" :class="{ 'has-error': errors.password }">
-      <small v-if="errors.password">{{ errors.password }}</small>
+      <label>Password:</label>
+      <input type="password" v-model.trim="password" placeholder="admin123" :class="{ 'invalid': invalidPassword }">
+      <span v-if="invalidPassword" class="error-message">Password must be between 6-20 characters.</span>
 
       <label><input type="checkbox" v-model="rememberMe"> Remember me</label>
 
@@ -17,48 +17,31 @@
   </div>
 </template>
 
-<script setup>
-import { ref, onMounted } from 'vue';
-import { useRouter } from 'vue-router';
-import { useStore } from 'vuex';
-
-const store = useStore();
-const router = useRouter();
-
-const username = ref('admin');
-const password = ref('admin');
-const rememberMe = ref(false);
-const errors = ref({});
-
-onMounted(() => {
-  if (localStorage.getItem('rememberMe')) {
-    username.value = localStorage.getItem('username');
-    rememberMe.value = true;
-  }
-});
-
-const handleLogin = () => {
-  errors.value = {};
-
-  if (username.value.length < 4 || username.value.length > 16 || /[^\w\s]/.test(username.value)) {
-    errors.value.username = 'Username must be 4-16 characters and no special characters.';
-  }
-
-  if (password.value.length < 6 || password.value.length > 20) {
-    errors.value.password = 'Password must be 6-20 characters.';
-  }
-
-  if (!errors.value.username && !errors.value.password) {
-    if (username.value === 'admin' && password.value === 'admin') {
-      if (rememberMe.value) {
-        localStorage.setItem('username', username.value);
-        localStorage.setItem('rememberMe', true);
+<script>
+export default {
+  data() {
+    return {
+      username: 'admin',
+      password: 'admin123',
+      rememberMe: false,
+      invalidUsername: false,
+      invalidPassword: false,
+    };
+  },
+  methods: {
+    handleLogin() {
+      this.invalidUsername = this.username.length < 4 || this.username.length > 16 || !/^[a-zA-Z0-9]+$/.test(this.username);
+      this.invalidPassword = this.password.length < 6 || this.password.length > 20;
+
+      if (!this.invalidUsername && !this.invalidPassword) {
+        if (this.username === 'admin' && this.password === 'admin123') {
+          this.$router.push('/');
+        } else {
+          alert('Username or password is incorrect.');
+        }
       }
-      router.push('/home');
-    } else {
-      errors.value.general = 'Username or password is incorrect.';
-    }
-  }
+    },
+  },
 };
 </script>
 
@@ -68,25 +51,15 @@ const handleLogin = () => {
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  width: 100%;
   height: 100vh;
-}
-
-.login-container label {
-  margin-bottom: 0.5rem;
-}
-
-.login-container input {
-  padding: 0.5rem;
-  margin-bottom: 1rem;
   width: 100%;
 }
 
-.has-error {
-  border-color: red;
+.error-message {
+  color: red;
 }
 
-.login-container button {
-  padding: 0.5rem 1rem;
+input.invalid {
+  border-color: red;
 }
 </style>

部分文件因为文件数量过多而无法显示