谷粒学院——Day05【后台系统前端项目创建、讲师管理模块前端开发】

news2025/4/3 0:54:05

后台系统前端项目创建

一、vue-element-admin

  1. 简介
    vue-element-admin 是基于 element-ui 的一套后台管理系统集成方案。
    功能:https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能
    GitHub地址:https://github.com/PanJiaChen/vue-element-admin
    项目在线预览:https://panjiachen.gitee.io/vue-element-admin

  2. 安装

    # 解压压缩包
    # 进入目录
    cd vue-element-admin-master
    
    # 安装依赖
    npm install
    
    # 启动。执行后,浏览器自动弹出并访问http://localhost:9527/
    npm run dev
    

二、vue-admin-template

  1. 简介
    vueAdmin-template 是基于 vue-element-admin 的一套后台管理系统基础模板(最少精简版),可作为模板进行二次开发。
    GitHub地址:https://github.com/PanJiaChen/vue-admin-template
    建议: 你可以在 vue-admin-template 的基础上进行二次开发,把 vue-element-admin 当做工具箱,想要什么功能或者组件就去 vue-element-admin 那里复制过来。

  2. 安装

    # 解压压缩包
    # 进入目录
    cd vue-admin-template-master
    
    # 安装依赖
    npm install
    
    # 启动。执行后,浏览器自动弹出并访问http://localhost:9528/
    npm run dev
    
  3. 项目启动
    在这里插入图片描述
    在这里插入图片描述

以上即完成了后台系统前端项目的环境搭建。

三、项目的创建和基本配置

1. 创建项目

vue-admin-template-master 重命名为 guli-admin

2. 修改项目信息

package.json 中进行修改:


{
    "name": "guli-admin",
    ......
    "description": "谷粒学院后台管理系统",
    "author": "Helen <55317332@qq.com>",
    ......
}

3. 如果需要修改端口号

config/index.js 中修改:

port: 9528

4. 项目的目录结构

. 
├── build // 构建脚本
├── config // 全局配置 
├── node_modules // 项目依赖模块
├── src //项目源代码
├── static // 静态资源
└── package.jspon // 项目信息和依赖配置
src 
├── api // 各种接口 
├── assets // 图片等资源 
├── components // 各种公共组件,非公共组件在各自view下维护 
├── icons //svg icon 
├── router // 路由表 
├── store // 存储 
├── styles // 各种样式 
├── utils // 公共工具,非公共工具,在各自view下维护 
├── views // 各种layout
├── App.vue //***项目顶层组件*** 
├── main.js //***项目入口文件***
└── permission.js //认证入口

5. 不使用Eslint语法检查

config/index.js 中修改:

 useEslint: false

6. 运行项目

npm run dev

四、登录页修改

src/views/login/index.vue(登录组件)中进行修改:

// 第4行
<h3 class="title">谷粒学院后台管理系统</h3>

// 第28行

<el-button :loading="loading" type="primary" style="width:100%;" @click.native.prevent="handleLogin">
    登录
</el-button>

五、页面零星修改

1. 标题

index.html(项目的html入口)中进行修改:

<title>谷粒学院后台管理系统</title>

修改后热部署功能,浏览器自动刷新。

2. 国际化设置

打开 src/main.js(项目的js入口),第7行,修改语言为 zh-CN,使用中文语言环境,例如:日期时间组件。

import locale from 'element-ui/lib/locale/lang/zh-CN' // lang i18n

3. icon

复制 favicon.ico 到根目录。

4. 导航栏文字

src/views/layout/components(当前项目的布局组件)
src/views/layout/components/Navbar.vue

// 第13行
<el-dropdown-item>
    首页
</el-dropdown-item>

// 第17行
<span style="display:block;" @click="logout">退出</span>

后台系统登录功能改造

在这里插入图片描述
在这里插入图片描述
config/dev.env.js 中对登录地址进行修改:
在这里插入图片描述
 
进行登录调用了两个方法, login 登录操作方法 和 info 登录之后获取用户信息的方法。所以,创建接口两个方法实现登录。

  • (1) login 方法: 返回 token 值。
  • (2) info方法: 返回 rolesnameavatar 值。

controller 包下创建 EduLoginController 类,代码如下:

@RestController
@RequestMapping("/eduService/user")
public class EduLoginController {

    // login
    @PostMapping("/login")
    public R login() {
        return  R.ok().data("token", "admin");
    }

    // info
    @GetMapping("/info")
    public R info() {
        return R.ok().data("roles","[admin]").data("name","admin").data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
    }

}

修改前端地址,api/login.js 修改为上面的接口路径:
在这里插入图片描述
重启前端服务器,开启后端服务器进行测试:
此时会出现跨域的问题。

什么是跨域问题:
通过一个地址去访问另外一个地址,这个过程中如果有三个地方任何不一样,即 访问协议、ip地址、端口号。

解决方案:
EduLoginController类上添加 @CrossOrigin 注解

@RestController
@CrossOrigin //解决跨域问题
@RequestMapping("/eduService/user")
public class EduLoginController {

    // login
    @PostMapping("/login")
    public R login() {
        return  R.ok().data("token", "admin");
    }

    // info
    @GetMapping("/info")
    public R info() {
        return R.ok().data("roles","[admin]").data("name","admin").data("avatar","https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
    }

}

重启前后端服务器进行测试:
在这里插入图片描述
 
现象: 每次请求都是发送两次。
在这里插入图片描述
他第一次请求发送的请求方式是:OPTIONS,他测试服务器是否连通,不会获取数据.

第二次请求发送的请求方式是 get / post,就会是发送数据,获取数据。

 

前端框架开发过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
 

讲师管理模块前端开发

1. 添加路由

src/router/index.js 中,复制一份 example 代码块并进行修改:

{
    // 地址输入
    path: '/teacher',
    component: Layout,
    // redirect: 重定向地址
    redirect: '/example/table',
    name: '讲师管理',
    // title:显示标签  icon:显示图标
    meta: { title: '讲师管理', icon: 'example' },
    children: [
      {
        path: 'table',
        name: '讲师列表',
        component: () => import('@/views/edu/teacher/list'),
        meta: { title: '讲师列表', icon: 'table' }
      },
      {
        path: 'save',
        name: '添加讲师',
        component: () => import('@/views/edu/teacher/save'),
        meta: { title: '添加讲师', icon: 'tree' }
      }
    ]
  },

 
添加路由后,可以在后台系统的前端页面左侧栏看到:
在这里插入图片描述

2. 创建路由对应的组件

创建 src/views/edu/teacher 文件夹存放组件,并建立讲师列表和添加讲师对应的组件 list.vuesave.vue,将对应的路由设置为对应的组件页面。
在这里插入图片描述

3. 定义访问的接口地址

创建 src/api/edu/teachere.js,用来定义访问的接口地址:

import request from '@/utils/request' // 引入已经封装好的axios 和 拦截器

export default {

    // 1. 讲师列表(条件查询分页)
    // page:当前页  limit:每页记录数  teacherQuery:条件对象
    getTeacherListPage(page,limit,teacherQuery) {
        return request({
        //    url: '/eduservice/edu-teacher/pageTeacherCondition/'+page+'/'+limit,
            url: `/eduservice/edu-teacher/pageTeacherCondition/${page}/${limit}`,
            method: 'post',
            // teacherQuery条件对象,如果后端使用RequestBody获取数据
            // data表示把对象转换成json对象进行传递到接口里
            data:teacherQuery
          })
    }
}

4. 组件页面调用定义接口方法

在讲师列表 list.vue 页面调用定义的接口方法,得到接口返回数据:

<template>
  <div class="app-container">
    讲师列表
  </div>
</template>

<script>
// 引入要调用的方法,teacher.js文件
import teacher from '@/api/edu/teacher.js'

export default {
    // 写核心代码位置
    // data: {
    // },
    data() { //定义变量和初始值
        return {
          list:null,//查询之后接口返回集合
          page:1,//当前页
          limit:10,//每页记录数
          total:0,//总记录数
          teacherQuery:{} //条件封装对象
        }
    },
    created() { //页面渲染之前执行,一般调用methods定义的方法
        // 调用
        this.getList()
    },
    methods: { // 创建具体的方法,调用teacher.js定义的方法
        // 讲师列表的方法
        getList() {
            teacher
                .getTeacherListPage(this.page,this.limit,this.teacherQuery)
                .then(response => {
                // response接口返回的数据
                // console.log(response)
                    this.list = response.data.rows
                    console.log(this.list)
                    this.total = response.data.total
                    console.log(this.total)
                }) //请求成功
                .catch(error => {
                    console.log(error)
                }) //请求失败
        }
    }
}

</script>

5. 测试

在这里插入图片描述
在这里插入图片描述
 

6. 使用element-ui快速构建页面

list.vue 中添加构建页面的代码:

 <!-- 表格 -->
    <el-table
      v-loading="listLoading"
      :data="list"
      element-loading-text="数据加载中"
      border
      fit
      highlight-current-row>

      <el-table-column
        label="序号"
        width="70"
        align="center">
        <template slot-scope="scope">
          {{ (page - 1) * limit + scope.$index + 1 }}
        </template>
      </el-table-column>

      <el-table-column prop="name" label="名称" width="80" />

      <el-table-column label="头衔" width="80">
        <template slot-scope="scope">
          {{ scope.row.level===1?'高级讲师':'首席讲师' }}
        </template>
      </el-table-column>

      <el-table-column prop="intro" label="资历" />

      <el-table-column prop="gmtCreate" label="添加时间" width="160"/>

      <el-table-column prop="sort" label="排序" width="60" />
      
      <el-table-column label="操作" width="200" align="center">
        <template slot-scope="scope">
          <router-link :to="'/edu/teacher/edit/'+scope.row.id">
            <el-button type="primary" size="mini" icon="el-icon-edit">修改</el-button>
          </router-link>
          <el-button type="danger" size="mini" icon="el-icon-delete" @click="removeDataById(scope.row.id)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>

重新热部署后的页面如下:
在这里插入图片描述

7. 分页功能

list.vue 中添加分页组件:

   <!-- 分页组件 -->
   <el-pagination
     :current-page="page"
     :page-size="limit"
     :total="total"
     style="padding: 30px 0; text-align: center;"
     layout="total, prev, pager, next, jumper"
     @current-change="getList"
   />

getList 分页方法进行修改:
在这里插入图片描述
在这里插入图片描述

 

8. 讲师条件查询

添加顶部的查询表单:
注意:
element-uidate-picker 组件默认绑定的时间值是默认世界标准时间,和中国时间差8小时。
设置 value-format="yyyy-MM-dd HH:mm:ss" 改变绑定的值

<!--查询表单-->
    <el-form :inline="true" class="demo-form-inline">
      <el-form-item>
       <el-input v-model="teacherQuery.name" placeholder="讲师名"/>
      </el-form-item>

      <el-form-item>
        <el-select v-model="teacherQuery.level" clearable placeholder="讲师头衔">
          <el-option :value="1" label="高级讲师"/>
          <el-option :value="2" label="首席讲师"/>
        </el-select>
      </el-form-item>

      <el-form-item label="添加时间">
        <el-date-picker
          v-model="teacherQuery.begin"
          type="datetime"
          placeholder="选择开始时间"
          value-format="yyyy-MM-dd HH:mm:ss"
          default-time="00:00:00"
        />
      </el-form-item>
      <el-form-item>
        <el-date-picker
          v-model="teacherQuery.end"
          type="datetime"
          placeholder="选择截止时间"
          value-format="yyyy-MM-dd HH:mm:ss"
          default-time="00:00:00"
        />
      </el-form-item>

      <el-button type="primary" icon="el-icon-search" @click="getList()">查询</el-button>
      <el-button type="default" @click="resetData()">清空</el-button>
    </el-form>

添加清空方法resetData():

methods: { // 创建具体的方法,调用teacher.js定义的方法
        // 讲师列表的方法
        getList(page =1) {
            this.page = page
            teacher
                .getTeacherListPage(this.page,this.limit,this.teacherQuery)
                .then(response => {
                // response接口返回的数据
                // console.log(response)
                    this.list = response.data.rows
                    console.log(this.list)
                    this.total = response.data.total
                    console.log(this.total)
                }) //请求成功
                .catch(error => {
                    console.log(error)
                }) //请求失败
        },
        resetData() { // 清空的方法
          // 表单输入项数据清空
          this.teacherQuery = {}
          // 查询所有讲师数据
          this.getList()
        }
    }

在这里插入图片描述
在这里插入图片描述
 

9. 讲师删除

  1. 定义api
    src/api/teacher/teacher.js 中添加删除讲师的 api

     // 删除讲师
        deleteTeacherId(id) {
            return request({
                url: `/eduservice/edu-teacher/deleteTeacherById/${id}`,
                method: 'delete'
            })
        }
    
  2. 定义methods
    src/views/edu/teacher/list.vue 中使用 MessageBox 弹框组件:

    //删除讲师的方法
            removeDataById(id) {
                this.$confirm('此操作将永久删除讲师记录, 是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {  //点击确定,执行then方法
                    //调用删除的方法
                    teacher.deleteTeacherId(id)
                        .then(response =>{//删除成功
                        //提示信息
                        this.$message({
                            type: 'success',
                            message: '删除成功!'
                        });
                        //回到列表页面
                        this.getList()
                    })
                }) //点击取消,执行catch方法
            }
    
  3. 测试
    在这里插入图片描述
    在这里插入图片描述
     

10. 讲师添加

  1. 定义api
    src/api/edu/teacher.js 中新增添加讲师的 api

      // 添加讲师
        addTeacher(teacher) {
           return request({
            url: `/eduservice/edu-teacher/addTeacher`,
            method: `post`,
            data: teacher
           })
        }
    
  2. 初始化组件
    src/views/edu/teacher/save.vue
    html:

    <template>
      <div class="app-container">
        讲师添加
         <el-form label-width="120px">
          <el-form-item label="讲师名称">
            <el-input v-model="teacher.name"/>
          </el-form-item>
          <el-form-item label="讲师排序">
            <el-input-number v-model="teacher.sort" controls-position="right" min="0"/>
          </el-form-item>
          <el-form-item label="讲师头衔">
            <el-select v-model="teacher.level" clearable placeholder="请选择">
              <el-option :value="1" label="高级讲师"/>
              <el-option :value="2" label="首席讲师"/>
            </el-select>
          </el-form-item>
          <el-form-item label="讲师资历">
            <el-input v-model="teacher.career"/>
          </el-form-item>
          <el-form-item label="讲师简介">
            <el-input v-model="teacher.intro" :rows="10" type="textarea"/>
          </el-form-item>
    
          <!-- 讲师头像:TODO -->
    
          <el-form-item>
            <el-button :disabled="saveBtnDisabled" type="primary" @click="saveOrUpdate">保存</el-button>
          </el-form-item>
        </el-form>
    
      </div>
    </template>
    

    js:

    <script>
    import teacherApi from '@/api/edu/teacher.js'
    export default {
        data() {
            return {
                teacher: {
                    name: '',
                    sort: 0,
                    level: 1,
                    creer: '',
                    intro: '',
                    avatar: ''
                },
                saveBtnDisabled: false // 保存按钮是否禁用
            }
        },
        created() {
    
        }, 
        methods: {
            saveOrUpdate() {
                // 添加
                this.saveTeacher()
            },
    
            // 添加讲师的方法
             saveTeacher() {
                teacherApi.addTeacher(this.teacher)
                .then(response => {//添加成功
                    //提示信息
                    this.$message({
                        message: "添加讲师记录成功",
                        type: "success",
                    });
                    //回到讲师列表, 路由跳转
                    this.$router.push({path: '/teacher/table'})
                });
             }
        }
    }
    </script>
    
  3. 排序
    eduservice/service/impl/EduTeacherServiceImpl 让添加进去的数据按时间进行排序:

    // 排序
     wrapper.orderByDesc("gmt_create");
    
  4. 测试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
     

11. 讲师信息回显

src/router/index.js 中添加一个隐藏路由:

 {
        path: 'edit/:id',
        name: 'EduTeacherEdit',
        component: () => import('@/views/edu/teacher/save'),
        meta: { title: '编辑讲师', noCache: true },
        hidden: true
    }    

在这里插入图片描述

通过router-link 的:to去’/teacher/edit/【:id携带id】'也就是上面这个路由,然后路由转换到save.vue组件上
在这里插入图片描述

在添加讲师页面实现数据回显:

src/api/edu/teacher.js 中 添加根据 id 查询讲师的api:

 //根据id查询讲师
    getTeacherInfo(id){
        return request({
            url: `/eduservice/edu-teacher/getTeacher/${id}`,
            method: `get`
    })

src/edu/teacher/save.vue:

 // 根据讲师id查询的方法,实现数据的回显
        getInfoById(id){
            teacherApi.getTeacherInfo(id)
                .then(response =>{
                    this.teacher = response.data.teacher
            })
        }

src/edu/teacher/save.vuecreated() 数据渲染前进行判断请求中是否有 id 值:

created() {//在页面渲染之前
        //判断路径中是否有id值
        if(this.$route.params && this.$route.params.id){
            //从路径中获取id值
            const id = this.$route.params.id
            //调用根据id查询的方法
            this.getInfoById(id)
        }
    }

测试:
在这里插入图片描述
在这里插入图片描述
 

12. 讲师修改

src/api/edu/teacher.js 中 添加修改讲师的api:

// 修改讲师
    updateTeacherInfo(teacher){
        return request({
            url: `/eduservice/edu-teacher/updateTeacher`,
            method: `post`,
            data: teacher
        })
    }

src\views\edu\teacher\save.vue 中添加修改讲师的方法:

// 修改讲师的方法
        updateTeacher() {
            teacherApi.updateTeacherInfo(this.teacher)
                .then(response => {
                    //提示信息
                    this.$message({
                        message: "修改讲师记录成功",
                        type: "success",
                 });
                //回到讲师列表 路由跳转
                this.$router.push({ path: "/teacher/table" });
            })
        }

将修改和添加操作和在一起:

 saveOrUpdate() {
            // 判断修改还是添加操作
            // 根据teacher对象是否有id值来判断
            if (!this.teacher.id) {
                // 添加
            this.saveTeacher()
            } else {
                // 修改
                this.updateTeacher()
            }
        },

测试:
在这里插入图片描述
 

在这里插入图片描述
 

在这里插入图片描述
 

13. 存在问题

遇到问题描述如下:
第一次点击修改,会进行数据回显,在此基础上去点击添加讲师,进入到表单页面,但是表单还是显示刚才修改回显的数据,正确效果应该是表单数据清空。

解决方案:

通过使用监听器监听

将原本 created() 里面的发按法封装到 init() 中,在 created() 中调用,并通过监听器监听路由变化就执行 init() 判断路径是否有id值,有就获取id值,没有就清空数据。

...
init() {
    //判断路径中是否有id值
    if (this.$route.params && this.$route.params.id) {
        //从路径中获取id值
        const id = this.$route.params.id;
        //调用根据id查询的方法
        this.getInfoById(id);
    }else{
        this.teacher = {};
    }
},
},
    created() {
        //在页面渲染之前
        this.init()
    },
        watch: {
            $route(to, from) {
                //路由变化方式,当路由发送变化,方法就执行
                console.log("watch $route");
                this.init()
            },
        }

 
 
创作不易,如果有帮助到你,请给文章点个赞和收藏,让更多的人看到!!!
关注博主不迷路,内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分布式锁_Redis分布式锁+Redisson分布式锁+Zookeeper分布式锁+Mysql分布式锁(原版)

分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁&#xff08;原版&#xff09; 文章目录分布式锁_Redis分布式锁Redisson分布式锁Zookeeper分布式锁Mysql分布式锁&#xff08;原版&#xff09;1. 传统锁回顾1.1. 从减库存聊起1.2. 环境准备1.3. 简单实现…

Dreamweaver网页设计与制作100例——HTML5期末考核大作业——票务网站整套网页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

正确查询DO基站IP

对于DO站的IP地址在系统中设置是否正确需要确定基站侧IP地址和RNC侧地址是否匹配&#xff0c;匹配关系为&#xff1a;基站侧IP地址减2即为RNC侧地址&#xff08;如&#xff1a;RCS 234 BTS-IP: 6.33.84.30 则匹配RNC侧地址即为6.33.84.28&#xff09;&#xff0c;下面举例进行襄…

基于单片机的语音小车设计

目 录 引言 1 1 系统概述 1 1.1 声控产品前景和发展趋势 1 1.2 研究目的和意义 1 1.3 本次设计内容 2 2 系统设计的整体方案 2 2.1 主控芯片的方案论证 2 2.2 语音识别模块的方案论证 3 2.3 电机驱动方案选择 4 2.4 本章小节 4 3 系统…

使用ssh克隆GitHub仓库以及替换https方式

目录 使用ssh克隆GitHub仓库 第一步&#xff1a;生成ssh 第二步&#xff1a;添加SSH key 第三步&#xff1a;验证绑定是否成功 第四步&#xff1a;克隆 意外的情况&#xff1a; 情况1&#xff1a;ssh连接GitHub失败 情况2&#xff1a;使用git clone 不成功 替换原来的…

队列的简单实现

队列的简单实现一、什么是队列二、队列的分类三、队列的数据结构四、队列的基本操作1、初始化队列2、销毁队列3、入队4、出队5、队列判空6、获取队头元素7、获取队尾元素8、获取队列元素总结头文件基本操作一、什么是队列 首先我们既然想要实现队列就得明白什么是队列&#xff…

1.7.4、计算机网络体系结构中的术语

1.7.4、计算机网络体系结构中的术语 1.7.4.1、实体 实体&#xff1a; 任何可发送或接收信息的硬件或软件进程。 对等实体&#xff1a; 收发双方相同层次中的实体 1.7.4.2、协议 协议&#xff1a;控制两个的对等实体进行逻辑通信的规则的集合 之所以称为逻辑通信&#xf…

目标检测论文解读复现之五:改进YOLOv5的SAR图像舰船目标检测

目标检测论文解读复现 文章目录目标检测论文解读复现前言一、摘要二、网络模型及核心创新点三、应用数据集四、实验效果&#xff08;部分展示&#xff09;五、实验结论六、投稿期刊介绍前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改…

HTML5期末考核大作业,电影网站——橙色国外电影 web期末作业设计网页

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

【代码精读】ATF的异常向量表

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 本文概述了ARMv8/ARMv9的aarch64体系中异常向量表的结构、以及基地寄存器的总结。然后通过导读ATF BL31的异常向量…

Flink系列文档-(YY09)-Flink时间语义

1 三种时间语义 在实时流式计算中&#xff0c;"时间"是一个能影响计算结果的非常重要因素&#xff01; 试想场景&#xff1a;每隔1分钟计算一次最近10分钟的活跃用户量&#xff1a; ①假设此刻的时间是13:10&#xff0c;要计算的活跃用户量时间段为&#xff1a;[ …

【C++】类和对象(下)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;再谈构造…

kindle自定义屏保之自定义字帖

kindle自定义屏保之自定义字帖 01 前言 毕业以后&#xff0c;很少动笔写字了&#xff0c;某天要手写一堆材料&#xff0c;写出来实在不忍直视&#xff0c;于是当晚下班后突发奇想——能不能把一些字帖搞成kindle屏保&#xff0c;摆在桌面上&#xff0c;睡前说不准还能练练 随…

web课程设计 基于html+css+javascript+jquery女性化妆品商城

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

软件测试基础知识

软件测试基础知识1.测试模型2.测试分类3.测试目的与原则4.测试流程5.测试发展规划6.单元测试7.黑盒测试8.白盒测试9.缺陷1.测试模型 瀑布模型 开发将系统都做好了&#xff0c;然后测试。最大问题是测试工作后置&#xff0c;导致整个项目开发完成之后如果发现比较重要的问题&…

基于微信小程序的校运会管理系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

【大学课程设计】计算器实现(附源码)

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

6.Paddle Graph Learning (PGL)图学习之图游走类模型[系列四]

Paddle Graph Learning (PGL)图学习之图游走类模型[系列四] 更多详情参考&#xff1a;Paddle Graph Learning 图学习之图游走类模型[系列四] https://aistudio.baidu.com/aistudio/projectdetail/5002782?contributionType1 相关项目参考&#xff1a; 关于图计算&图学习…

路由规划——运输距离的估算

运输距离的估算1. 常规的拟合距离1.1 欧氏距离1. 2 球面距离拟合2. 一种改进的球面距离拟合参考文献在进行路径规划时&#xff0c;需要获取点与点之间的距离&#xff0c;点之间的距离通常是通过坐标或者经纬度计算得到&#xff0c;可分为拟合距离和导航距离两类。导航距离顾名思…

基础二叉树及其高频面试题

目录 一、树的概念及其结构 1.1 树的概念 1.2 树的相关概念 1.3 树的表示法 二、二叉树的概念及其结构 2.1 概念 2.2 特殊二叉树 2.3 二叉树的性质 2.4 二叉树的存储结构 顺序存储 链式存储 三、链式二叉树 3.1 遍历方式 深度优先遍历:DFS 层序遍历:BFS(广度优先…