2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
अत्र vue3+springboot+mybatis+mysql इत्यस्य परियोजना कार्यान्वयनम् अस्ति, यत् केवलं अग्रे-अन्त-पृष्ठ-अन्त-पृथक्करणस्य प्रवेश-पञ्जीकरण-कार्यं कार्यान्वितं करोति मुख्यानि साधनानि सन्ति: विचारः, navicat
विषयवस्तुसारणी
1. vue3 परियोजनां प्रारम्भिकविन्यासं च रचयन्तु
2. परियोजनासंरचनायाः परिवर्तनं कुर्वन्तु
२) परिवर्तिता निर्देशिकासंरचना
प्रवेशपञ्जीकरणपृष्ठं सम्पादयित्वा लिखन्तु
५) प्रवेशपञ्जीकरणपृष्ठप्रदर्शनम्
2. springboot+mysql+mybatis परियोजनां रचयन्तु तथा च आँकडाधारेण सह सम्बद्धं कुर्वन्तु
3. लॉगिन् तथा पञ्जीकरणपृष्ठ-अन्त-कार्यं लिखन्तु
परियोजनां निर्मातुं भवान् मम एकं लेखं द्रष्टुं शक्नोति:
IDEA_idea vue3-CSDN blog इत्यनेन सह कस्टम् vue3 परियोजनां रचयन्तु
निर्माणानन्तरं प्रारम्भिकनिर्देशिकासंरचना : १.
प्रथमं भवद्भिः मूलनिर्देशिकसंरचना परिवर्तयितुं आवश्यकम्
संपत्तियांचित्राणि पोस्ट कुर्वन्तु
घटकाःमध्यवर्ती घटकाः, प्रायः पुनः उपयोगयोग्याः
रूटरसर्वेषां मुख्यपृष्ठानां सञ्चिकामार्गाः यस्मिन् मार्गे विन्यस्ताः भवन्ति
संग्रहःसामान्यतया vuex राज्यप्रबन्धनार्थं प्रयुक्तम्, यथा टोकनस्य संग्रहणम् इत्यादि ।
दृश्यानिकेन्द्रं मुख्यपृष्ठम् अस्ति
App.vueइदं Vue अनुप्रयोगस्य मूलघटकम् अस्ति ।
मुख्य.जइयं अनुप्रयोगस्य प्रविष्टिसञ्चिका अस्ति, प्रायः vue, vue router इत्यादीनां आश्रयाणां परिचयार्थं उपयुज्यते ।
प्रवेशः पञ्जीकरणकार्यं च कार्यान्वितुं परिवर्तिता निर्देशिकासंरचना अस्ति :
प्रवेशपञ्जीकरणपृष्ठं कार्याणि च कार्यान्वितुं घटकपुटस्य अधः LoginAndRegister.vue रचयन्तु अत्र, अहं केवलं प्रवेशस्य पञ्जीकरणस्य च कृते .vue सञ्चिकां रचयामि, यस्मिन् v-if इत्यस्य उपयोगः भवति यत् प्रवेशखण्डः पञ्जीकरणखण्डः च तत्त्वानि समाविष्टानि सन्ति वा इति .प्रतिपादनं, तस्मात् तेषां प्रदर्शनं प्रभावितं करोति।
प्रारम्भिकसेटिंग्स्
v-if="loginShow"为true, v-if="registerShow"为false
यदा बटनं टोग्ल् कर्तुं क्लिक् भवति तदा सत्यं असत्यं च टॉगलं करोति ।
सफलपञ्जीकरणानन्तरं पुनः प्रवेशविभागे गच्छन्तु ।
सुविधायै उपयोक्तृ-अभ्यासाय च यद्यपि उपयोक्तृ-विशेषणेषु id, username, password, phone, gender च सन्ति तथापि पञ्जीकरणस्य समये केवलं उपयोक्तृनाम गुप्तशब्दं च पूर्यते, तथा च कार्यं केवलं कार्यान्वितं भवति गुप्तशब्दः एन्क्रिप्टेड् नास्ति तथा च अस्ति पर्याप्तं सुरक्षितं नास्ति अहं पुनः लेखं अद्यतनं करिष्यामि यत् सुरक्षितप्रवेशपञ्जीकरणविधिविषये लिखितुं शक्नोमि, तथैव प्रवेशानन्तरं व्यक्तिगतसूचनाः कथं सुधारयितुम्।
LoginAndRegister.vue: 1.1.
- <template>
- <div class="container">
- <div class="login-box" v-if="loginShow">
- <!-- 菱形群-->
- <div class="decoration1 decoration"></div>
- <div class="decoration2 decoration"></div>
- <div class="decoration3 decoration"></div>
- <div class="decoration4 decoration"></div>
- <div class="decoration5 decoration"></div>
- <div class="decoration decoration4 decoration6"></div>
- <div class="decoration decoration7 decoration2"></div>
- <div class="decoration decoration8 decoration3"></div>
- <div class="login-title">
- <h1>Login</h1>
- </div>
- <div class="login-part">
- <input class="login-input" v-model="username" placeholder="Username" />
- <input class="login-input" type="password" v-model="password" placeholder="Password" />
- <button class="login-button" @click="login">Login</button>
- <div>
- 还未注册?点击<a class="change-link" @click="changeToRegister">这里</a>注册
- </div>
- </div>
- </div>
- <div class="login-box" v-if="registerShow">
- <!-- 菱形群-->
- <div class="decoration1 decoration"></div>
- <div class="decoration2 decoration"></div>
- <div class="decoration3 decoration"></div>
- <div class="decoration4 decoration"></div>
- <div class="decoration5 decoration"></div>
- <div class="decoration decoration4 decoration6"></div>
- <div class="decoration decoration7 decoration2"></div>
- <div class="decoration decoration8 decoration3"></div>
- <div class="login-title">
- <h1>Register</h1>
- </div>
- <div class="login-part">
- <input class="login-input" v-model="username" placeholder="Username" />
- <input class="login-input" type="password" v-model="password" placeholder="Password" />
- <button class="login-button" @click="register">Register</button>
- <span class="change-link" @click="changeToLogin">返回登录</span>
- </div>
- </div>
- <!-- <div class="decoration decoration1"></div>-->
- <!-- <div class="decoration decoration2"></div>-->
- <!-- <div class="decoration decoration3"></div>-->
- <!-- <div class="decoration decoration4"></div>-->
- </div>
- </template>
-
- <script>
- import { ref } from 'vue'
- import { useRouter } from 'vue-router' // 导入 useRouter
-
- import '../style/Login.css' // 导入css
- export default {
- name: 'LoginVue',
- setup () {
- const username = ref('')
- const password = ref('')
- const phone = ref('')
- const loginShow = ref(true)
- const registerShow = ref(false)
- const router = useRouter()
-
- const changeToRegister = async () => {
- loginShow.value = false
- registerShow.value = true
- }
-
- const changeToLogin = async () => {
- loginShow.value = true
- registerShow.value = false
- }
-
- const login = async () => {
- console.log('Login with:', username.value, password.value)
- try {
- const formData = new FormData()
- formData.append('username', username.value)
- formData.append('password', password.value)
- const response = await fetch('http://localhost:8081/api/user/login', {
- method: 'POST',
- body: formData
- })
- const data = await response.json()
- if (response.ok) {
- console.log('Link success', data)
- if (data.code === 200) {
- // 登录成功
- alert('登录成功!')
- await router.push('/home')
- } else {
- alert(data.msg)
- }
- } else {
- console.error('Link failed', data)
- }
- } catch (error) {
- console.error('Error login', error)
- }
- }
-
- const register = async () => {
- console.log('Register with:', username.value, password.value)
- try {
- const formData = new FormData()
- formData.append('username', username.value)
- formData.append('password', password.value)
- const response = await fetch('http://localhost:8081/api/user/register', {
- method: 'POST',
- body: formData
- })
- const data = await response.json()
- if (response.ok) {
- if (data.code === 200) {
- console.log('Register success', data)
- alert('注册成功!')
- await changeToLogin()
- } else {
- console.log('Register failed', data)
- alert(data.msg)
- }
- } else {
- console.error('Register failed', data)
- }
- } catch (error) {
- console.error('Error during register', error)
- }
- }
-
- return { username, password, phone, login, loginShow, registerShow, changeToRegister, register, changeToLogin }
- }
- }
- </script>
-
- <style>
-
- </style>
Home.vue इति मुख्यपृष्ठं यत् सफलप्रवेशानन्तरं कूर्दति ।
Home.vue: .
- <template>
- 首页<br><br>
- <button class="login-button" @click="signOut">退出登录</button>
- </template>
-
- <script>
- import { useRouter } from 'vue-router'
-
- export default {
- name: 'HomeVue',
- setup () {
- const router = useRouter()
- const signOut = async () => {
- await router.push('/')
- }
- return { signOut }
- }
- }
- </script>
-
- <style scoped>
-
- </style>
पृष्ठमार्गविन्यासविन्यासः, यदा मार्गः /, /login प्रवेशपृष्ठं, /home च गृहपृष्ठं भवति तदा प्रवेशपृष्ठं प्रति पुनर्निर्देशनं कुर्वन्तु ।
अनुक्रमणिका.ज्स्: .
- import { createRouter, createWebHistory } from 'vue-router'
- import Login from '../components/LoginAndRegister.vue'
- import Home from '../views/Home.vue'
-
- const routes = [
- {
- path: '/',
- redirect: '/login'
- },
- {
- path: '/login',
- name: 'Login',
- component: Login
- },
- {
- path: '/home',
- name: 'Home',
- component: Home
- }
- ]
-
- const router = createRouter({
- history: createWebHistory(process.env.BASE_URL),
- routes
- })
-
- export default router
प्रवेशपञ्जीकरणपृष्ठस्य कृते CSS डिजाइनम् ।
प्रवेशः.css:
- *{
- margin: 0;
- padding: 0;
- }
- .container{
- height: 100vh;
- display: flex;
- justify-content: center;
- align-items: center;
- overflow: hidden;
- position: relative;
- }
- .login-box{
- background-color: white;
- padding: 40px 100px;
- border-radius: 8px;
- box-shadow: 0 0 5px 1px gainsboro;
- position: relative;
- }
- .login-part{
- display: flex;
- flex-direction: column;
- justify-content: center;
- margin-top: 20px;
- gap: 20px;
- }
- .login-input{
- width: 250px;
- height: 30px;
- border-radius: 8px;
- }
- .login-button{
- height: 40px;
- border-radius: 8px;
- background-color: #2c3e50;
- color: white;
- transition: 0.5s;
- }
- .login-button:hover{
- background-color: darkcyan;
- font-size: 15px;
- transition: 0.5s;
- }
- .login-button:active{
- background-color: darkslateblue;
- }
- .change-link{
- color: #00BFFF;
- text-decoration: underline;
- }
- .change-link:hover{
- color: cornflowerblue;
- }
-
- .decoration {
- position: absolute;
- width: 200px;
- height: 200px;
- background: linear-gradient(to left, #FDF5E6, #96CDCD );
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- z-index: 1;
- }
- .decoration1 {
- top: 150px;
- left: -210px;
- }
- .decoration2 {
- top: 20px;
- right: -20px;
- width: 100px; /* 第二个菱形的大小 */
- height: 100px;
- background: linear-gradient(to right, #FFF5EE, #E6E6FA);
- }
- .decoration3 {
- top: 50px;
- right: -180px;
- width: 200px; /* 第三个菱形的大小 */
- height: 200px;
- background: linear-gradient(to right, #7FFFD4, cadetblue);
- }
- .decoration4 {
- top: 200px;
- right: -200px;
- width: 500px; /* 第三个菱形的大小 */
- height: 500px;
- z-index: -1;
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- background: linear-gradient(to right, #FFFACD, #00BFFF);
- }
- .decoration5 {
- top: -100px;
- right: 200px;
- width: 400px; /* 第三个菱形的大小 */
- height: 400px;
- z-index: -1;
- clip-path: polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%);
- background: linear-gradient(to right, #AFEEEE, #00BFFF);
- }
- .decoration6 {
- top: 10px;
- right: -680px;
- }
-
- .decoration7 {
- top: -170px;
- right: -500px;
- }
-
- .decoration8 {
- top: -140px;
- right: -655px;
- }
हीरकरूपेण खण्डाः यादृच्छिकरूपेण व्यवस्थापिताः भवन्ति, आरम्भे ते एतादृशाः दृश्यन्ते ।
पश्चात् मया कतिपयानि अधिकानि हीरक-आकार-खण्डानि योजयित्वा तेषां स्थानानि वर्णाः च परिवर्तिताः अन्तिमः प्रभावः निम्नलिखितरूपेण अस्ति ।
केवलं पृष्ठ-अन्त-प्रकल्पं निर्मातुं तथा च आँकडाधारेण सह सम्बद्धं कर्तुं springboot, mysql, mybatis इत्येतयोः उपयोगं कुर्वन्तु, सन्दर्भः:
लेखस्य पूरकम् : १.
यदि भवान् प्रत्येकं एण्टिटी क्लास् निर्माय set इति लिखितुं मेथड् प्राप्तुं च कष्टं अनुभवति तर्हि pom.xml मध्ये निम्नलिखितनिर्भरताः योजयितुं शक्नोति ।
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- </dependency>
ततः सेट् लेखनं त्यक्त्वा मेथड्स् प्राप्तुं entity क्लास् मध्ये @Data एनोटेशनस्य उपयोगं कुर्वन्तु:
प्रक्रिया प्रायः समाना एव, परन्तु अस्मिन् समये मया निर्मितः दत्तांशः भिन्नः अस्ति मुख्यकारणं यत् उपयोक्तृसारणी विशेषताः दत्तांशः च परिवर्तितः (अन्तरं महत् नास्ति, सूपः च औषधं न परिवर्तयति):
समस्यायाः सम्मुखीभूय: maven आश्रयान् अवतरणं कुर्वन् अस्ति, परन्तु दीर्घकालं यावत् प्रतिक्रिया नास्ति
तथापि परियोजनायाः निर्माणकाले किमपि भ्रष्टं जातम् अस्मिन् समये अहं प्रथमवारं मया निर्मितम् आसीत् फलतः Maven इत्यस्य आरम्भस्य अनन्तरं विविधानि आश्रयाणि प्लग् च डाउनलोड् कुर्वन् आसीत् -ins, तथा च दीर्घकालं यावत् प्रतिक्रिया नासीत्:
समाधानं:
अहं सञ्चयं स्वच्छं कृत्वा विचारं पुनः आरब्धवान्, परन्तु तस्य अल्पः प्रभावः अभवत् ।
पश्चात् मया आविष्कृतं यत् एतत् भवितुं शक्नोति यतोहि Maven पूर्वनिर्धारितरूपेण विदेशीयस्य केन्द्रीयगोदामस्य उपयोगं करोति, अहं च विचारे maven प्लग-इन् इत्यस्य उपयोगं कुर्वन् आसीत्, अतः डाउनलोड् गतिः अतीव मन्दः भविष्यति
अतः अहं maven स्थानीयरूपेण डाउनलोड् कृतवान्, पाठ्यक्रमं पश्यन्तु:
Maven डाउनलोड् तथा संस्थापन पाठ्यक्रम (सुपर विस्तृत)_maven संस्थापन-CSDN ब्लॉग
पाठ्यक्रमानुसारं डाउनलोड् कुर्वन्तु तथा च maven संस्थापनमार्गे->conf->settings.xml इत्यस्मिन् चित्रस्य URL परिवर्तयन्तु तथापि, अहं प्रत्यक्षतया file->settings-> इत्यस्मिन् विचारे सेट् न कृतवान् Build, Execution, Deployment->Build Tools-> Maven इत्यस्मिन् Maven गृहमार्गं स्थानीयमार्गे परिवर्तयन्तु:
परिवर्तनानन्तरं डाउनलोड् वेगः खलु बहु द्रुततरः भवति ।
अन्तिमपृष्ठभागप्रकल्पस्य निर्देशिकासंरचना निम्नलिखितरूपेण अस्ति ।
अग्रभागेन पारितां पूरितां सूचनां प्राप्नुवन्तु, यत्र उपयोक्तृनाम गुप्तशब्दः च सन्ति, तथा च दत्तांशकोशे उपयोक्तृनाम गुप्तशब्दाधारितं प्रश्नं कुर्वन्तु यदि उपयोक्ता लभ्यते तर्हि उपयोक्ता अस्ति इति अर्थः .प्रवेशः सफलः भवति, अन्यथा विफलः भवति ।
अग्रभागेन पारितां पूरणसूचनाः प्राप्नुवन्तु, यत्र उपयोक्तृनाम गुप्तशब्दः च सन्ति इति निर्णयानन्तरं प्रथमं दत्तांशकोशे उपयोक्तृनामनुसारं उपयोक्तारं अन्वेष्टुम् विफलतां प्राप्नोति तथा च विफलतायाः सूचना प्रत्यागच्छति तर्हि उपयोक्तारः पञ्जीकरणं कृत्वा अभिलेखं सफलपञ्जीकरणानन्तरं प्रवेशखण्डं प्रदर्शितं भविष्यति तथा च पञ्जीकरणखण्डः गोपनीयः भविष्यति।
तेषु संसाधनं->mapper->UserMapper.xml:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-
- <mapper namespace="com.example.demo.mapper.UserMapper" >
- <resultMap id="result" type="com.example.demo.entity.User">
- <result property="id" column="id" />
- <result property="username" column="username" />
- <result property="password" column="password" />
- <result property="phone" column="phone" />
- <result property="gender" column="gender"/>
- </resultMap>
-
- <!-- 通过用户名和密码查找对应用户,用于登录-->
- <select id="findUserByNameAndPwd" resultMap="result" parameterType="User">
- select * from user
- where username = #{username}
- and password = #{password}
- </select>
-
-
- <!-- 通过用户名查找对应用户,用于注册检验用户名是否已存在-->
- <select id="findUserByName" resultMap="result" parameterType="User">
- select * from user
- where username = #{username}
- </select>
-
- <!-- 添加用户-->
- <insert id="addUser" parameterType="User">
- insert into user (username, password)
- values ( #{username}, #{password} )
- </insert>
-
- </mapper>
जावा-> कॉम.उदाहरण.डेमो-> मैपर-> यूजरमैपर.जावा:
- package com.example.demo.mapper;
-
- import com.example.demo.entity.User;
- import org.apache.ibatis.annotations.Mapper;
-
- @Mapper
- public interface UserMapper {
- // 通过用户名和密码查找对应用户
- public User findUserByNameAndPwd(User user);
- // 通过用户名查找用户
- public User findUserByName(User user);
- // 添加用户
- public void addUser(User user);
- }
जावा-> कॉम.उदाहरण.डेमो-> सेवा->उपयोक्तृसेवा.जावा:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
-
- public interface UserService {
- // 通过用户名和密码查找对应id
- public User findUserByNameAndPwd(User user);
- // 通过用户名查找用户
- public User findUserByName(User user);
- // 添加用户
- public void addUser(User user);
- }
जावा-> कॉम.उदाहरण.डेमो-> सेवा->उपयोक्तृसेवाइम्पल.जावा:
- package com.example.demo.service;
-
- import com.example.demo.entity.User;
- import com.example.demo.mapper.UserMapper;
- import jakarta.annotation.Resource;
- import org.springframework.stereotype.Service;
-
- @Service
- public class UserServiceImpl implements UserService {
- @Resource
- private UserMapper userMapper;
-
- // 通过用户名和密码查找对应id
- @Resource
- public User findUserByNameAndPwd(User user){
- return userMapper.findUserByNameAndPwd(user);
- }
-
- // 通过用户名查找用户
- @Resource
- public User findUserByName(User user){
- return userMapper.findUserByName(user);
- }
-
- // 添加用户
- @Resource
- public void addUser(User user){
- userMapper.addUser(user);
- }
- }
जावा-> कॉम.उदाहरण.डेमो-> नियंत्रक-> उपयोक्तृनियंत्रक.जावा:
- package com.example.demo.controller;
-
-
- import com.example.demo.entity.User;
- import com.example.demo.result.Result;
- import com.example.demo.service.UserService;
- import jakarta.annotation.Resource;
- import org.springframework.web.bind.annotation.*;
-
-
- @RestController
- @RequestMapping("/api/user")
- public class UserController {
- @Resource
- UserService userService;
-
- // 登录
- @CrossOrigin
- @PostMapping(value = "/login")
- public Result login(@ModelAttribute("user") User user){
- String username=user.getUsername();
- String password=user.getPassword();
- System.out.println("Login received username: " + username);
- System.out.println("Login received password: " + password);
- User userCheck = new User();
- userCheck.setUsername(username);
- userCheck.setPassword(password);
- System.out.println(userCheck.getUsername() + " " + userCheck.getPassword());
- try{
- User findUser = userService.findUserByNameAndPwd(userCheck);
- if(findUser != null){
- return Result.success(findUser);
- }else {
- return Result.failure(401,"用户名或密码错误");
- }
- }catch (Exception e){
- return Result.failure(500,"服务器异常");
- }
- }
-
- // 注册
- @CrossOrigin
- @PostMapping(value = "/register")
- public Result register(@ModelAttribute("user") User user){
- // String username = "222";
- // String password = "222";
- User userCheck = new User();
- userCheck.setUsername(user.getUsername());
- userCheck.setPassword(user.getPassword());
- if(userCheck.getUsername() == null || userCheck.getUsername().isEmpty() || userCheck.getPassword() == null || userCheck.getPassword().isEmpty()){
- System.out.println("用户名或密码不可为空");
- return Result.failure(201,"用户名和密码不可为空");
- }else {
- System.out.println("Register received username: " + userCheck.getUsername());
- System.out.println("Register received password: " + userCheck.getPassword());
- try{
- // 先在数据库中查找是否已有用户名相同的用户
- User findUser = userService.findUserByName(userCheck);
- if(findUser != null){
- // 用户名已存在
- return Result.failure(202,"用户名已存在!");
- }
- else {
- // 新用户,数据库添加记录
- userService.addUser(userCheck);
- return Result.success(userCheck);
- }
- }catch (Exception e) {
- return Result.failure(500, "服务器异常");
- // }
- }
- }
- }
- }
अग्रे पृष्ठे च पृथक् पृथक् चालिताः आरब्धाः च अत्र अहं application.properties इत्यस्मिन् पृष्ठभागं 8081 इति परिवर्तितवान्, अग्रभागः च पूर्वनिर्धारितः 8080 अस्ति अतः अग्रे पृष्ठे च परियोजना सफलतया चालितस्य अनन्तरं http:/ इति प्रविष्टं कुर्वन्तु । /localhost:8080 ब्राउजर् मध्ये , विकासकसाधनानाम् संजाले तस्य जाँचं कुर्वन्तु, पृष्ठभागे सफलतया संयोजयन्तु, तथा च परीक्षणनिवेशार्थं प्रवेशं कुर्वन् पञ्जीकरणं कुर्वन्तः भिन्नाः प्रॉम्प्ट् सूचनाः पॉप-अप-प्रोम्प्ट् च सफलतया प्रत्यागच्छन्तु:
सफलप्रवेशानन्तरं : १.