【Vue】简易博客项目跟做

news2024/11/25 5:03:48

项目框架搭建

1.使用vue create快速搭建vue项目

在这里插入图片描述

2.使用VC Code打开新生成的项目

在这里插入图片描述

  • 端口号简单配置

修改vue.config.js文件,内容修改如下

在这里插入图片描述

所需库安装

npm install vue-resource --save --no-fund

npm install vue-router@3 --save --no-fund

npm install axios --save --no-fund

关闭eslint检测

修改.eslintrc.js文件,注释掉'eslint:recommended',并在rules中加上"vue/no-unused-components":"off"

不关闭检测,组件注册后未被使用时,会直接报错导致项目无法运行

在这里插入图片描述

前端网站开发

添加博客页

修改App.vue,注册AddBlog组件

<template>
  <div id="app">
    <add-blog></add-blog>
  </div>
</template>

<script>
import AddBlog from './components/AddBlog'
export default {
  name: 'app',
  components: {
    AddBlog
  }
}
</script>

<style>
</style>

编写AddBlog.vue代码

<template>
    <div id="add-blog">
        <h2>添加博客</h2>
        <form v-if="!submited">
            <label>博客标题</label>
            <input type="text" v-model="blog.title" required />
            <label>博客内容</label>
            <textarea v-model="blog.content"></textarea>
            <div id="checkboxes">
                <label>Vue.js</label>
                <input type="checkbox" value="Vue.js" v-model="blog.categories">
                <label>Node.js</label>
                <input type="checkbox" value="Node.js" v-model="blog.categories">
                <label>React.js</label>
                <input type="checkbox" value="React.js" v-model="blog.categories">
                <label>Angular4</label>
                <input type="checkbox" value="Angular4" v-model="blog.categories">
            </div>
            <label>作者:</label>
            <select v-model="blog.author">
                <option v-for="author in authors" :key="author">{{ author }}</option>
            </select>
            <button v-on:click.prevent="post">添加博客</button>
        </form>

        <div v-if="submited">
            <h3>添加成功</h3>
        </div>
        <hr>
        <!-- 展示预览区域 -->
        <div id="preview">
            <h3>博客总览</h3>
            <p>博客标题:{{ blog.title }}</p>
            <p>博客内容:</p>
            <p>{{ blog.content }}</p>
            <p>博客分类:</p>
            <ul>
                <li v-for="category in blog.categories" :key="category">
                    {{ category }}
                </li>
            </ul>
            <p>作者:</p>
            <p>{{ blog.author }}</p>
        </div>

    </div>
</template>

<script>
export default {
    // 测试数据网站:https://jsonplaceholder.typicode.com/posts
    name: 'add-blog',
    data() {
        return {
            blog: {
                title: "",
                content: "",
                categories: [],
                author: ""
            },
            authors: ["cy", "fy", "cyfy"],
            submited: false
        }
    },
    methods: {
        post: function () {
            // 向指定网站发送post请求
            this.$http.post("https://jsonplaceholder.typicode.com/posts", {
                title: this.blog.title,
                body: this.blog.content,
                UserId: 1
            }).then(function (data) {	// 接受网站返回的数据
                this.submited = true;
                // console.log(data);
            });
        }
    }
}
</script>

<style scoped>
/* 针对id=add-blog下所有元素 */
#add-blog * {
    box-sizing: border-box;
}

#add-blog {
    margin: 20px auto;
    max-width: 600px;
    padding: 20px;
}

label {
    display: block;
    margin: 20px 0 10px;
}

input[type="text"],
textarea,
select {
    display: block;
    width: 100%;
    padding: 8px;
}

textarea {
    height: 200px;
}

#checkboxes label {
    display: inline-block;
    margin-top: 0;
}

#checkboxes input {
    display: inline-block;
    margin-right: 10px;
}

button {
    display: block;
    margin: 20px 0;
    background: cyan;
    color: fff;
    border: 0;
    padding: 14px;
    border-radius: 4px;
    font-size: 18px;
    cursor: pointer;
}

#preview {
    
    padding: 10px 20px;  		/* 内边距:上下边距 左右边距 */ 
    border: 1px dotted #ccc;	/* 边框设置:边框大小 边框样式 边框颜色 */
    margin: 30px 0;				/* 外边距:上下边距 左右边距 */
}

h3 {
    margin-top: 10px;			/* 上外边距	*/
}
</style>

编写main.js文件,注册使用VueResource组件

import Vue from 'vue'
// 导入vue-resource
import VueResource from 'vue-resource'
import App from './App.vue'
import store from './store'

Vue.config.productionTip = false
// 使用VueResource
Vue.use(VueResource)

new Vue({
  store,
  render: h => h(App),
}).$mount('#app')

运行效果

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

博客列表页

修改App.vue,注册ShowBlogs组件

<template>
  <div id="app">
    <!-- <add-blog></add-blog> -->
    <show-blogs></show-blogs>
  </div>
</template>

<script>
import AddBlog from './components/AddBlog'
import ShowBlogs from './components/ShowBlogs'

export default {
  name: 'app',
  components: {
    AddBlog,ShowBlogs
  }
}
</script>

<style>
</style>

编写ShowBlogs.vue代码

<template>
  <div v-theme:column="'wide'" id="show-blogs">
    <h1>博客总览</h1>
    <input type="text" v-model="search" placeholder="搜索" />
    <div class="single-blog" v-for="blog in filteredBlogs" :key="blog.id">
        <h2 v-rainbow>{{ blog.title | to-uppercase }}</h2>
        <article>{{ blog.body | snippet }}</article>
    </div>
  </div>
</template>

<script>

export default {
  name: 'show-blogs',
  data() {
    return {
      blogs: [],
      search: ""
    }
  },
  created() {
    this.$http.get('https://jsonplaceholder.typicode.com/posts')
      .then(function (data) {
        // 截取前十条数据,赋值给blogs中
        this.blogs = data.body.slice(0, 10);
      })
  },
  computed: {
    // 过滤博客,筛选出符合条件的博客
    filteredBlogs: function () {
      return this.blogs.filter((blog) => {
        return blog.title.match(this.search) || blog.body.match(this.search);
      })
    }
  },
  filters: {
    // 标题字母全部转换为大写字母
    toUppercase(value) {
      return value.toUpperCase();
    },
    // 博客内容一次仅显示100字符,后面字符用“...”代替
    snippet(value) {
      return value.slice(0, 100) + "...";
    }
  },
  directives: {
    // 标题字体颜色随机
    "rainbow": {
      bind(el, binding, value) {
        el.style.color = "#" + Math.random().toString(16).slice(2, 8);
      }
    },
    // 根据属性值赋予博客列表最大宽度
    "theme": {
      bind(el, binding, value) {
        if (binding.value == 'wide') {
          el.style.maxWidth = "1260px";
        } else if (binding.value == 'narrow') {
          el.style.maxWidth = "560px";
        }
        if (binding.arg == 'column') {
          el.style.background = "#6677cc";
          el.style.padding = '20px';
        }
      }
    }
  }

}
</script>

<style>
#show-blogs {
  max-width: 800px;
  margin: 0 auto;
}

.single-blog {
  padding: 20px;
  margin: 20px 0;
  box-sizing: border-box;
  background: #eee;
  border: 1px dotted #aaa;
}

#show-blogs a {
  color: #444;
  text-decoration: none;
}
    
input[type="text"] {
  padding: 8px;
  width: 100%;
  box-sizing: border-box;
}
</style>

运行效果

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

实现路由跳转

编写main.js文件,注册使用vue-router组件

import Vue from 'vue'
import VueResource from 'vue-resource'
import App from './App.vue'
import store from './store'
// 导入vue-router
import VueRouter from 'vue-router'
// 导入路由配置文件
import Routes from './routes/routes'

Vue.config.productionTip = false

Vue.use(VueResource)
// 使用VueRouter
Vue.use(VueRouter)


// 创建路由
const router = new VueRouter({
  routes:Routes,
  // 去除路径上的#号
  mode:"history"
})


new Vue({
  store,
  render: h => h(App),
  // 注册路由配置
  router:router
}).$mount('#app')

编写routes.js文件,配置路由跳转逻辑

import AddBlog from './../components/AddBlog';
import ShowBlogs from './../components/ShowBlogs';
export default[
    {
        path:"/",
        component:ShowBlogs
    },
    {
        path:"/add",
        component:AddBlog
    }
]

修改App.vue,注册BlogHeader组件实现导航栏功能

<template>
  <div id="app">
    <!-- <add-blog></add-blog> -->
    <!-- <show-blogs></show-blogs> -->
    <blog-header></blog-header>
    <router-view></router-view>
  </div>
</template>

<script>
import AddBlog from './components/AddBlog'
import ShowBlogs from './components/ShowBlogs'
import BlogHeader from './components/BlogHeader'

export default {
  name: 'app',
  components: {
    AddBlog,ShowBlogs,BlogHeader
  }
}
</script>

<style>
</style>

编写BlogHeader.vue代码

<template>
    <nav>
        <ul>
            <li>
                <router-link to="/" exact>博客总览</router-link>
                <router-link to="/add" exact>博客发布</router-link>
            </li>
        </ul>
    </nav>
</template>

<script>
export default({
    name:"blog-header"
})
</script>

<style scoped>
ul{
  /* 去除列表前面的符号“·” */
  list-style-type: none;
  /* 字体居中 */
  text-align:center;
  margin:0;
}
li{
  display: inline-block;
  margin: 0 px;
}
a{
    color:#fff;
    text-decoration: none;
    padding: 12px;
    border-radius: 5px;
}
nav{
    background: crimson;
    padding: 30px 0;
    margin-bottom: 40px;
}
.router-link-active{
    background: rgba(255,255,255,0.8);
    color: #444;
}
</style>

运行效果

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

博客详情页

修改routes.js,增加详情页路由配置

import AddBlog from './../components/AddBlog';
import ShowBlogs from './../components/ShowBlogs';
import SingleBlog from './../components/SingleBlog';
export default[
    {
        path:"/",
        component:ShowBlogs
    },
    {
        path:"/add",
        component:AddBlog
    },
    {
        path:"/blog/:id",component:SingleBlog
    }
]

编写SingleBlog.vue代码,实现博客详情页

<template>
    <div id="single-blog">
        <h1>{{ blog.title }}</h1>
        <article>{{ blog.body }}</article>
    </div>
</template>

<script>
export default({
    name:"single-blog",
    data(){
        return {
            // 获取URL路径上的id值
            id:this.$route.params.id,
            blog:{}
        }
    },
    created(){
        // 请求本地JSON数据
        this.$http.get('https://jsonplaceholder.typicode.com/posts/' + this.id)
        .then(function(data){
            this.blog = data.body;
        })
    }
})
</script>

<style scoped>
#single-blog{
    max-width: 960px;
    margin: 0 auto;
    padding: 20px;
    background: #eee;
    border: 1px dotted #aaa;
}
</style>

修改ShowBlogs.vue,增加点击跳转

<template>
  <div v-theme:column="'wide'" id="show-blogs">
    <h1>博客总览</h1>
    <input type="text" v-model="search" placeholder="搜索" />
    <div class="single-blog" v-for="blog in filteredBlogs" :key="blog.id">
      <!-- 使用router-link实现路由跳转 -->
      <router-link v-bind:to="'/blog/' + blog.id">
        <h2 v-rainbow>{{ blog.title | to-uppercase }}</h2>
        <article>{{ blog.body | snippet }}</article>
      </router-link>
    </div>
  </div>
</template>

运行效果

在这里插入图片描述

数据地址替换

因为https://jsonplaceholder.typicode.com/posts提供的数据是死的,并不能随意修改,所以改用https://vuedemo-b1233.firebaseio.com【别人搭建的firebase网站数据,可能会被关闭/移除】

使用axios

修改main.js,加入axios配置,替代vue-resource请求数据

import Vue from 'vue'
// import VueResource from 'vue-resource'
import App from './App.vue'
import store from './store'
import VueRouter from 'vue-router'
import Routes from './routes/routes'
import axios from 'axios'

// 全局配置
axios.defaults.baseURL = 'https://vuedemo-b1233.firebaseio.com'

Vue.config.productionTip = false

// Vue.use(VueResource)
Vue.use(VueRouter)

// 创建路由
const router = new VueRouter({
  routes:Routes,
  // 去除路径上的#号
  mode:"history"
})

new Vue({
  store,
  render: h => h(App),
  router:router
}).$mount('#app')

修改所有博客主页,使用axios替代$http

修改ShowBlog.vue

<template>
  <div v-theme:column="'wide'" id="show-blogs">
    <h1>博客总览</h1>
    <input type="text" v-model="search" placeholder="搜索" />
    <div class="single-blog" v-for="blog in filteredBlogs" :key="blog.id">
      <router-link v-bind:to="'/blog/' + blog.id">
        <h2 v-rainbow>{{ blog.title | to-uppercase }}</h2>
        <article>{{ blog.content | snippet }}</article>
      </router-link>
    </div>
  </div>
</template>

<script>
import axios from 'axios'
export default {
  name: 'show-blogs',
  data() {
    return {
      blogs: [],
      search: ""
    }
  },
  created() {
    axios.get('/posts.json')
      .then(function(data){
        return data.data;
      }).then((data) => {
        var blogsArray = [];
        for(let key in data){
          data[key].id = key;
          // 如果content为空,则将body的值赋予给content
          // 这么做的原因:因为数据有很多人修改,出现了很多错误数据
          if(!data[key].content){
            data[key].content = data[key].body;
          }
          blogsArray.push(data[key]);
        }
        // 截取前十条数据,赋值给blogs中
        this.blogs = blogsArray.slice(0, 10);
      })
  },
  computed: {
    filteredBlogs: function () {
      return this.blogs.filter((blog) => {
        return blog.title.match(this.search) || blog.content.match(this.search);
      })
    }
  },
  filters: {
    toUppercase(value) {
      return value.toUpperCase();
    },
    snippet(value) {
      return value.slice(0, 100) + "...";
    }
  },
  directives: {
    "rainbow": {
      bind(el, binding, value) {
        el.style.color = "#" + Math.random().toString(16).slice(2, 8);
      }
    },
    "theme": {
      bind(el, binding, value) {
        if (binding.value == 'wide') {
          el.style.maxWidth = "1260px";
        } else if (binding.value == 'narrow') {
          el.style.maxWidth = "560px";
        }
        if (binding.arg == 'column') {
          el.style.background = "#6677cc";
          el.style.padding = '20px';
        }
      }
    }
  }

}
</script>

修改SingleBlog.vue

<template>
    <div id="single-blog">
        <h1>{{ blog.title }}</h1>
        <article>{{ blog.content }}</article>
    </div>
</template>

<script>
import axios from 'axios'
export default({
    name:"single-blog",
    data(){
        return {
            id:this.$route.params.id,
            blog:{}
        }
    },
    created(){
        // 请求本地JSON数据
        axios.get('/posts/' + this.id + '.json')
        .then((data) => {
            // 如果content为空,则将body的值赋予给content
            if(!data.data.content){
                data.data.content = data.data.body;
            }
            this.blog =data.data;
        })
    }
})
</script>

修改AddBlog.vue

<template>
    <div id="add-blog">
        <h2>添加博客</h2>
        <form v-if="!submited">
            <label>博客标题</label>
            <input type="text" v-model="blog.title" required />
            <label>博客内容</label>
            <textarea v-model="blog.content"></textarea>

            <div id="checkboxes">
                <label>Vue.js</label>
                <input type="checkbox" value="Vue.js" v-model="blog.categories">
                <label>Node.js</label>
                <input type="checkbox" value="Node.js" v-model="blog.categories">
                <label>React.js</label>
                <input type="checkbox" value="React.js" v-model="blog.categories">
                <label>Angular4</label>
                <input type="checkbox" value="Angular4" v-model="blog.categories">
            </div>

            <label>作者:</label>
            <select v-model="blog.author">
                <option v-for="author in authors" :key="author">{{ author }}</option>
            </select>
            <button v-on:click.prevent="post">添加博客</button>
        </form>

        <div v-if="submited">
            <h3>添加成功</h3>
        </div>
        <hr>
        <div id="preview">
            <h3>博客总览</h3>
            <p>博客标题:{{ blog.title }}</p>
            <p>博客内容:</p>
            <p>{{ blog.content }}</p>
            <p>博客分类:</p>
            <ul>
                <li v-for="category in blog.categories" :key="category">
                    {{ category }}
                </li>
            </ul>
            <p>作者:</p>
            <p>{{ blog.author }}</p>
        </div>

    </div>
</template>

<script>
import axios from 'axios'
export default {
    // https://jsonplaceholder.typicode.com/posts
    name: 'add-blog',
    data() {
        return {
            blog: {
                title: "",
                content: "",
                categories: [],
                author: ""
            },
            authors: ["cy", "fy", "cyfy"],
            submited: false
        }
    },
    methods: {
        post: function () {
            axios.post("/posts.json", 
            this.blog)
            .then( (data) => {
                this.submited = true;
                console.log(data);
            });
        }
    }
}
</script>

运行效果

在这里插入图片描述

删除博客

修改SingleBlog.vue,增加删除逻辑

<template>
    <div id="single-blog">
        <h1>{{ blog.title }}</h1>
        <article>{{ blog.content }}</article>
        <p>作者:{{ blog.author }}</p>
        <p>分类:</p>
        <ul>
            <li v-for="category in blog.categories" :key="category">{{ category }}</li>
        </ul>
        <button @click="deleteSingleBlog()">删除</button>
    </div>
</template>

<script>
import axios from 'axios'
export default({
    name:"single-blog",
    data(){
        return {
            id:this.$route.params.id,
            blog:{}
        }
    },
    created(){
        // 请求本地JSON数据
        axios.get('/posts/'
         + this.id + '.json')
        .then((data) => {
            // 如果content为空,则将body的值赋予给content
            if(!data.data.content){
                data.data.content = data.data.body;
            }
            if(!data.data.categories){
                data.data.categories = [];
            }
            this.blog =data.data;
        })
    },
    methods:{
        deleteSingleBlog(){
            axios.delete('/posts/'
                + this.id + '.json').then(response =>{
                    console.log("删除成功");
                    this.$router.push({path:'/'})
                })
        }
    }
})
</script>

运行效果:
在这里插入图片描述

博客编辑页

修改SingleBlog.vue,增加编辑页跳转

<template>
    <div id="single-blog">
        <h1>{{ blog.title }}</h1>
        <article>{{ blog.content }}</article>
        <p>作者:{{ blog.author }}</p>
        <p>分类:</p>
        <ul>
            <li v-for="category in blog.categories" :key="category">{{ category }}</li>
        </ul>
        <button @click="deleteSingleBlog()">删除</button>
        <router-link :to="'/edit/' + id">编辑</router-link> 
    </div>
</template>

修改router.js,增加编辑页跳转

import AddBlog from './../components/AddBlog';
import ShowBlogs from './../components/ShowBlogs';
import SingleBlog from './../components/SingleBlog';
import EditBlog from './../components/EditBlog';
export default[
    {
        path:"/",
        component:ShowBlogs
    },
    {
        path:"/add",
        component:AddBlog
    },
    {
        path:"/blog/:id",component:SingleBlog
    },
    {
        path:"/edit/:id",component:EditBlog
    }
]

编写EditBlog.vue,实现博客编辑页

<template>
    <div id="edit-blog">
        <h2>编辑博客</h2>
        <form v-if="!submited">
            <label>博客标题</label>
            <input type="text" v-model="blog.title" required />
            <label>博客内容</label>
            <textarea v-model="blog.content"></textarea>

            <div id="checkboxes">
                <label>Vue.js</label>
                <input type="checkbox" value="Vue.js" v-model="blog.categories">
                <label>Node.js</label>
                <input type="checkbox" value="Node.js" v-model="blog.categories">
                <label>React.js</label>
                <input type="checkbox" value="React.js" v-model="blog.categories">
                <label>Angular4</label>
                <input type="checkbox" value="Angular4" v-model="blog.categories">
            </div>

            <label>作者:</label>
            <select v-model="blog.author">
                <option v-for="author in authors" :key="author">{{ author }}</option>
            </select>
            <button v-on:click.prevent="edit">编辑博客</button>
        </form>

        <div v-if="submited">
            <h3>编辑成功</h3>
        </div>
        <hr>
        <div id="preview">
            <h3>博客总览</h3>
            <p>博客标题:{{ blog.title }}</p>
            <p>博客内容:</p>
            <p>{{ blog.content }}</p>
            <p>博客分类:</p>
            <ul>
                <li v-for="category in blog.categories" :key="category">
                    {{ category }}
                </li>
            </ul>
            <p>作者:</p>
            <p>{{ blog.author }}</p>
        </div>

    </div>
</template>

<script>
import axios from 'axios'
export default {
    name: 'edit-blog',
    data() {
        return {
            id:this.$route.params.id,
            blog: {
                title: "",
                content: "",
                categories: [],
                author: ""
            },
            authors: ["cy", "fy", "cyfy"],
            submited: false
        }
    },
    methods: {
        fetchDate(){
            axios.get('/posts/' + this.id + '.json')
            .then(data =>{
                // 如果categories不存在,就给它赋值为空
                if(!data.data.categories){
                    data.data.categories = [];
                }
                this.blog = data.data;
            })
        },
        edit: function () {
            axios.put('/posts/' + this.id + '.json',
                this.blog)
                .then((data) => {
                    this.submited = true;
            });
        }
    },
    created(){
        this.fetchDate();
    }
}
</script>

<style scoped>
/* 针对id=add-blog下所有元素 */
#edit-blog * {
    box-sizing: border-box;
}

#edit-blog {
    margin: 20px auto;
    max-width: 600px;
    padding: 20px;
}

label {
    display: block;
    margin: 20px 0 10px;
}

input[type="text"],
textarea,
select {
    display: block;
    width: 100%;
    padding: 8px;
}

textarea {
    height: 200px;
}

#checkboxes label {
    display: inline-block;
    margin-top: 0;
}

#checkboxes input {
    display: inline-block;
    margin-right: 10px;
}

button {
    display: block;
    margin: 20px 0;
    background: cyan;
    color: fff;
    border: 0;
    padding: 14px;
    border-radius: 4px;
    font-size: 18px;
    cursor: pointer;
}

#preview {
    /* 内边距 */
    padding: 10px 20px;
    /* 边框 */
    border: 1px dotted #ccc;
    /* 外边距 */
    margin: 30px 0;
}

h3 {
    margin-top: 10px;
}
</style>

运行效果
在这里插入图片描述发布成功
在这里插入图片描述

整体项目结构

在这里插入图片描述

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

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

相关文章

机器人助力Bridge Champ游戏:1.4.2版本如何提升玩家体验

在Bridge Champ游戏中&#xff0c;机器人扮演着桥牌游戏的“无名英雄”角色&#xff0c;默默地提升玩家体验。凭借智能化的设计&#xff0c;这些机器人不仅能够陪练&#xff0c;也大大提升了比赛的流畅度与趣味性。 Bridge Champ是什么 Bridge Champ是一个基于Ignis公链的在线…

U-Mail反垃圾邮件网关精准拦截各种垃圾病毒邮件

在当今数字化时代&#xff0c;电子邮件已成为企业沟通不可或缺的一部分。然而&#xff0c;其开放性也使得电子邮件系统容易受到垃圾邮件和恶意软件的侵袭。根据最新数据&#xff0c;2024年第二季度&#xff0c;国内企业邮箱用户共收到9.1亿封垃圾邮件&#xff0c;这一数字比上一…

Docker可视化管理面板DPanel的安装

本文软件由网友 rui 推荐&#xff1b; 什么是 DPanel &#xff1f; DPanel 是一款 Docker 可视化管理面板&#xff0c;旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能&#xff0c;使用户能够更轻松地管理和部署 Docker 环境。 软件特点&#xff1a; 可视化管理&…

Java——final用法

一、final 介绍 在Java中&#xff0c;final关键字有多种用途&#xff0c;可以用来修饰变量、方法和类。它的主要作用是确保所修饰的内容不可改变。 二、final 用法 1、修饰变量 1&#xff09;局部变量 当一个局部变量被声明为final时&#xff0c;它的值在初始化后就不能被…

科技改变生活:最新智能开关、调光器及插座产品亮相

根据QYResearch调研团队的最新力作《欧洲开关、调光器和插座市场报告2023-2029》显示&#xff0c;预计到2029年&#xff0c;欧洲开关、调光器和插座市场的规模将攀升至57.8亿美元&#xff0c;并且在接下来的几年里&#xff0c;将以4.2%的复合年增长率&#xff08;CAGR&#xff…

走进算法大门---双指针问题(一)

一.双指针算法介绍 概念&#xff1a;双指针是指在遍历数据结构&#xff08;如数组、链表等&#xff09;时使用两个指针&#xff0c;通过特定的移动规则来解决问题。这两个指针可以同向移动&#xff0c;也可以相向移动。 同向双指针&#xff1a;常用于解决需要两个位置信息的问…

用 Python 从零开始创建神经网络(一)

用 Python 从零开始创建神经网络&#xff08;一&#xff09; 引言1. A Single Neuron&#xff1a;Example 1代码部分&#xff1a; Example 2代码部分&#xff1a; 2. A Layer of Neurons&#xff1a;Example 1代码部分&#xff1a; 引言 本教程专为那些对神经网络已有基础了解…

深度学习⑨GANs

Discriminative and Generative Models Deep learning中主要两种模型 判别模型专注于从输入预测输出,例如分类任务。学习数据点和标签之间的特征 生成模型则试图理解数据是如何产生的,能够生成新的数据样本。理解数据分布和是否可以被预测 Quiz time: Discriminative mo…

[产品管理-58]:安索夫矩阵矩阵帮助创业者确定研发出来的产品在市场中定位策略

目录 一、提出背景 二、核心思想与结构 三、应用背景与领域 四、实践案例 安索夫矩阵&#xff08;Ansoff Matrix&#xff09;&#xff0c;也被称为产品/市场方格或成长矢量矩阵&#xff0c;其应用背景可以从以下几个方面进行详细阐述&#xff1a; 一、提出背景 安索夫矩阵…

物联网对商业领域的影响

互联网彻底改变了通信方式&#xff0c;并跨越了因地理障碍造成的人与人之间的鸿沟。然而&#xff0c;物联网&#xff08;IoT&#xff09;的引入通过使设备能够连接到互联网&#xff0c;改变了设备的功能。想象一下&#xff0c;你的闹钟连接到互联网&#xff0c;并且能够用你的声…

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

LED点阵显示(Proteus 与Keil uVision联合仿真)(点阵字模提取)

点阵字模提取&#xff1a; https://pan.baidu.com/s/1DZSeLyD_SUkaHRgTm26o-A 提取码: 1111 一、LED点阵显示器结构 点亮点阵中一个发光二极管条件&#xff1a;对应行为高电平&#xff0c;对应列为低电平。如在很短时间内依次点亮很多个发光二极管&#xff0c;LED点阵就可显示…

JDBC学习记录

文章目录 一、JDBC简介1.1、 JDBC概念1.2、 JDBC本质1.3、 JDBC好处 二、JDBC快速入门2.1、 编写代码步骤2.2、 代码示例 三、JDBC API详解3.1、DriverManager3.1.1、注册驱动3.1.2、获取连接 3.2、Connection3.2.1、获取执行对象3.2.2、事务管理 3.3、Statement3.3.1、执行DDL…

[Linux] 进程等待 | 进程替换

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 我有一个朋友&#x…

运用Agent搭建“狼人杀”游戏服务器端!

背景 从23年开年以来&#xff0c;大模型引爆了各行各业。去年比较出圈的是各类文生图的应用&#xff0c;比如Stable Diffusion。网上可以看到各类解释其背后的原理和应用的文章。另外一条平行线&#xff0c;则是文生文的场景。受限于当时LLM&#xff08;大语言模型&#xff09…

笔记分享 |【黑马Pink老师】Web APIs

Web API 基本认知 介绍 严格意义上讲&#xff0c;我们在 JavaScript 阶段学习的知识绝大部分属于 ECMAScript 的知识体系&#xff1b; ECMAScript 简称 ES 它提供了一套语言标准规范&#xff0c;如变量、数据类型、表达式、语句、函数等语法规则都是由 ECMAScript 规定的&am…

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin

Android Glide动态apply centerCropTransform(),transition withCrossFade动画,Kotlin import android.graphics.Bitmap import android.os.Bundle import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.Glide import …

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区&#xff0c;只是默认开窗存储&#xff1b; 分区是按行&#xff0c;如一百行数据&#xff0c;按十位上的数字分区&#xff0c;则有十个分区&#xff0c;每个分区里有十行&#xff1b; 分桶是根据某个字段哈希对桶数取…

嵌入式新手必读好文,常见传感器类型中,LM393的作用,及模块原理(看不懂来问我)!!!

目录 序言 常感器基本知识 常见传感器原理 D0引脚的作用 如何设置电位器 欢迎指正&#xff0c;希望对你&#xff0c;有所帮助&#xff0c;禁止搬运&#xff01;&#xff01;&#xff01; 前言&#xff1a;编写不易&#xff0c;请问搬运&#xff0c;仅供学习&#xff0c;有…

机器学习2_支持向量机_线性可分——MOOC

目录 定义 线性可分&#xff08;Linear Separable&#xff09; 线性不可分&#xff08;Nonlinear Separable&#xff09; 数学化定义 问题描述 优化问题 线性可分定义 假定训练样本集是线性可分的 1、最小化&#xff08;Minimize&#xff09;&#xff1a; 2、限制条件…