electron vue 模仿qq登录界面

news2024/11/18 12:23:59

1、使用vuecli创建vue项目

我用的vue2

vue create qq_test

2、安装electron

npm install electron -g
//or
npm install electron@12.0.11   //老版本

3、vue项目安装Electron-builder打包工具

版本我选择的是12

vue add electron-builder

4、在vue项目的src下有个background.js文件

background.js里面有默认的配置,修改后我的配置大概如下

'use strict'
 
import { app, protocol, BrowserWindow, Menu, Tray } from 'electron'
 
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
 
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])
 
async function createWindow() {
  // Create the browser window.
  const win = new BrowserWindow({
    width: 432,
    height: 331,
    alwaysOnTop: true,//窗口一直保持在其他窗口前面
    modal: true,
    frame: false,
    darkTheme: true,
    resizable: false,//用户不可以调整窗口
    center: true, // 窗口居中
    transparent: false,//窗口透明
    show: false,// 显示窗口将没有视觉闪烁(配合下面的ready-to-show事件)
    hasShadow: true,//窗口是否有阴影
    webPreferences: {
      // Use pluginOptions.nodeIntegration, leave this alone
      // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
      // nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION,
      // contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
      devTools: true,//客户端可以打开开发者工具(在客户端打开快捷键:ctrl+shift+i)
      nodeIntegration: true,
      enableRemoteModule: true, // 使用remote模块(electron12版本就开始废除了,需要我们自己安装remote模块)
      contextIsolation: false,
      //解决axios请求跨域问题(不推荐,不安全,但简单好用)
      webSecurity: false,
    },
  })
 
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // Load the url of the dev server if in development mode
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) win.webContents.openDevTools()
  } else {
    createProtocol('app')
    // Load the index.html when not in development
    win.loadURL('app://./index.html')
  }
}
 
// Quit when all windows are closed.
app.on('window-all-closed', () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== 'darwin') {
    app.quit()
  }
})
 
 
app.on('activate', () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})
 
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.once('ready-to-show', () => {
  win.show();
})
 
app.on('ready', async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    // Install Vue Devtools
    try {
      await installExtension(VUEJS_DEVTOOLS)
    } catch (e) {
      console.error('Vue Devtools failed to install:', e.toString())
    }
  }
  createWindow()
})
 
// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}

5、安装remote模块
因为electron12版本开始就废除了remote模块,我们需要自己安装

npm install @electron/remote --save
//or
cnpm install @electron/remote --save

能在客户端实现 最大化、最小化、关闭功能

6、代码

1、Login.vue页面(登录页面)

里面的最小化图标、关闭图标、最大化图标 请自己去 iconfont-阿里巴巴矢量图标库 下载

<template>
  <div class="login" style="overflow:hidden;">
    <!-- 顶部 -->
    <header class="header">
      <!-- 最小化按钮 -->
      <span @click="minwin" class="iconfont icon-24gl-minimization"></span>
      <!-- 关闭按钮 -->
      <span @click="close" class="iconfont icon-guanbi"></span>
    </header>
 
    <main>
      <!-- 顶部背景图 -->
      <div class="bg">
        <img style="" src="../../assets/images/login.gif" />
      </div>
      <!-- 登录表单组件 -->
      <div class="body">
        <Login_form></Login_form>
      </div>
    </main>
    <footer class="footer">
      <div class="zczh" @click="zc">注册账号</div>
      <div>
        <span title="二维码登录" class="iconfont icon-erweima"></span>
      </div>
    </footer>
  </div>
</template>
 
<script>
import "@/assets/css/login.css";
import "@/assets/fonts/gb/iconfont.css";
import "@/assets/fonts/zxh/iconfont.css";
import "@/assets/fonts/ewm/iconfont.css";
import Login_form from "@/components/Login_form.vue";
 
//网页测试要关闭,打包成软件要启动
const { remote } = window.require("electron");
 
export default {
  name: "login",
  data() {
    return {};
  },
  components: {
    Login_form,
  },
  methods: {
    close() {
      // 只是关闭窗口,软件不退出
      // remote.getCurrentWindow().hide()
 
      // 关闭窗口,退出软件
      remote.getCurrentWindow().close();
    },
    // 最小化
    minwin() {
      // 最小化,在任务栏显示
      remote.getCurrentWindow().minimize()
 
      // 隐藏窗口,任务栏也隐藏
      // remote.getCurrentWindow().hide();
    },
    zc() {
      this.$router.push("/reg");
    },
    
  },
  mounted() {
    //显示窗口
    remote.getCurrentWindow().show();
  },
};
</script>
 
<style lang="scss" scpoed>
.login {
  max-width: 900px;
  overflow: hidden;
  min-width: 430px;
  .bg {
    img {
      width: 430px;
      height: 124px;
      object-fit: cover;
    }
  }
}

2、login.css

/**
取消全部的外边距和内边距
 */
* {
    padding: 0;
    margin: 0;
}
 
/*设置窗口的样式*/
.login {
    cursor: default;
    /*设置手型*/
    /* border: 1px solid red; */
    /*加一个边框 调试样式 最后要删除或者更改**/
    width: 430px;
    /*设置宽度  必须要和主进程中设置的一样 不能大于主进程中设置的宽度 否则会出现滚动条*/
    height: 329px;
    /*设置高度  必须要和主进程中设置的一样 不能大于主进程中设置的高度 否则会出现滚动条*/
    position: relative;
    /*设置为相对定位*/
    /* border-radius: 4px; */
    /*设置圆角*/
    border: 1px solid #464545;
    /* 拖 */
    -webkit-app-region: drag;
    /* 禁止滚动条 */
    overflow: hidden;
}
 
/**
header的样式 header中只会有一个关闭按钮 处于右上角
 */
.login header.header {
    position: absolute;
    /*设置绝对定位 因为背景在他下面*/
    height: 30px;
    /*设置高度*/
 
    /* border-radius: 20px 20px 0 0; */
    /*给header的左上角 右上角设置圆角 不然会出现很尴尬的页面*/
    width: 428px;
    /* 因为设置了绝对定位 设置宽度*/
 
    /* background: rgba(255, 255, 255, 0.2); */
    /*暂时设置的 后面要删除或者更改*/
    text-align: right;
}
 
/**
背景
 */
.login main .bg {
    height: 124px;
    /*设置高度*/
    width: 430px;
    /*设置宽度 也可以不用设置 因为这个元素没有设置绝对定位 所以默认就是100%*/
    /* border-radius: 4px 4px 0 0; */
    /*给左上角 右上角设置圆角 不然会出现很尴尬的页面 这里和header重合在一起了*/
    /* background: url("@/assets/images/login.gif") 10px; */
    background-size: 100%;
}
 
/**
放置表单的元素
 */
.login main .body {
    width: 428px;
    /*设置宽度 也可以不用设置 因为这个元素没有设置绝对定位 所以默认就是100%*/
    height: 200px;
    /*设置高度 这里的高度是 主窗口(326) - footer(30) - 背景(124) 因为header设置了绝对定位 所以不用关 */
    /* background: green; */
    /*暂时设置的 后面要删除或者更改*/
}
 
.login footer.footer {
    position: absolute;
    /* 设置绝对定位 要让他处于窗口的最底部*/
    height: 30px;
    /*设置高度 */
    /* background: red; */
    /*暂时设置的 后面要删除或者更改*/
    bottom: 0;
    /*让footer处于底部*/
    width: 397.99px;
    /* 因为设置了绝对定位 设置宽度*/
    /* border-radius: 0 0 5px 5px; */
    background-color: #FFFFFF;
}
 
.login header.header span{
    display: inline-block;
    height: 30px;
    width:30px;
    text-align: center;
    line-height: 30px;
    color:#E4393c;
    cursor: pointer;
 
}
.login header.header span:hover{
    background-color: rgba(255,255,255,0.6);
    cursor: pointer;
}
.zczh{
    cursor: pointer;
    color: #7c7a7a;
    user-select: none;
    -webkit-app-region: no-drag;
}
.zczh:hover{
    cursor: pointer;
    color: black;
    user-select: none;
    -webkit-app-region: no-drag;
}

3、Login_form.vue组件

里面的resetMessage信息提示是我重新封装的element组件(我就不放上去了)

里面的最小化图标、关闭图标、最大化图标 请自己去 iconfont-阿里巴巴矢量图标库 下载

<template>
  <div class="login_form">
    <form>
      <div class="form_item">
        <i class="iconfont icon-zhanghao"></i
        ><input
          @focus="i1_get"
          @blur="i1_lose"
          @input="input1($event)"
          id="text"
          v-model="email"
          type="email"
          :placeholder="placeholder1"
          @keyup.enter="login"
        />
      </div>
      <div class="form_item">
        <i class="iconfont icon-mima"></i
        ><input
          @focus="i2_get"
          @blur="i2_lose"
          id="text2"
          v-model="password"
          type="password"
          :placeholder="placeholder2"
          @keyup.enter="login"
        />
      </div>
      <div class="login_options">
        <label
          ><div class="option_item">
            <input
              :disabled="jzmm"
              v-model="zddl"
              type="checkbox"
              autocomplete="off"
            />
          </div>
          <i class="text">记住账号</i></label
        >
        <label
          ><div class="option_item">
            <input
              @click="jzmm_mm"
              v-model="jzmm"
              type="checkbox"
              autocomplete="off"
            />
          </div>
          <i class="text">记住密码</i></label
        >
        <i class="text wjmm">忘记密码</i>
      </div>
    </form>
    <div class="buttons">
      <button @click="login">登录</button>
    </div>
  </div>
</template>
 
<script>
import "@/assets/css/login_form.css";
import "@/assets/fonts/xlk/iconfont.css";
import "@/assets/fonts/slk/iconfont.css";
import "@/assets/fonts/zh/iconfont.css";
import "@/assets/fonts/mm/iconfont.css";
 
//网页测试要关闭,打包成软件要启动
const { remote } = window.require("electron");
 
export default {
  name: "Login_form",
  data() {
    return {
      email: "",
      password: "",
      placeholder1: "邮箱",
      placeholder2: "密码",
      zddl: false,
      jzmm: false,
    };
  },
  methods: {
    i1_get() {
      if (!this.email) {
        this.placeholder1 = "";
      }
    },
    i2_get() {
      if (!this.password) {
        this.placeholder2 = "";
      }
    },
    i1_lose() {
      if (!this.email) {
        this.placeholder1 = "邮箱";
      }
    },
    i2_lose() {
      if (!this.password) {
        this.placeholder2 = "密码";
      }
    },
    input1(e) {
      if (e.target.value == "") {
        // console.log(val);
        this.password = "";
        this.placeholder2 = "密码";
      }
    },
    login() {
      var eamil_gz =
        /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
      switch (true) {
        case this.email == "":
          this.waring("邮箱不能为空!");
          break;
        case !eamil_gz.test(this.email):
          this.error("邮箱格式错误");
          break;
        case this.password == "":
          this.waring("密码不能为空!");
          break;
        default:
          let data = {
            log_email: this.email,
            log_password: this.password,
          };
          this.$axios
            .post("/login/login", data)
            // 在后台查询信息 返回res结果
            .then((res) => {
              // console.log(res.data);
              switch (true) {
                case res.data.code == 200:
                  //登录成功
                  this.success(res.data.msg);
                  //本地存储
                  localStorage.setItem("email", this.email);
                  localStorage.setItem("token", res.data.token);
                  if (this.zddl == true) {
                    localStorage.setItem("zddl", true);
                  } else {
                    localStorage.removeItem("zddl");
                    localStorage.removeItem("email");
                  }
                  if (this.jzmm == true) {
                    localStorage.setItem("zddl", true);
                    localStorage.setItem("jzmm", true);
                    localStorage.setItem("mm", this.password);
                  } else {
                    localStorage.removeItem("jzmm");
                    localStorage.removeItem("mm");
                  }
                  this.$router.push("/chat_index");
                  //登录成功跳转会有点闪屏,先隐藏,到另外一个路由再显示
                  remote.getCurrentWindow().hide();
                  //登录之后设置窗口在电脑桌面显示位置
                  remote.getCurrentWindow().setPosition(386, 192);
                  break;
                case res.data.code == 404:
                  //邮箱不存在
                  this.error(res.data.msg);
                  break;
                case res.data.code == 300:
                  //密码错误
                  this.error(res.data.msg);
                  break;
                case res.data.code == 400:
                  //用户异常
                  this.error(res.data.msg);
                  break;
                default:
                  //未知错误
                  this.error(res.data.msg);
                  break;
              }
            })
            .catch((error) => {
              //报错
            });
          break;
      }
    },
    //记住密码
    jzmm_mm() {
      if (this.zddl == false) {
        this.zddl = true;
      }
      this.jzmm = true;
    },
    // 警告提示
    waring(title) {
      this.$resetMessage({
        message: `${title}`,
        type: "warning",
      });
    },
    // 成功提示
    success(title) {
      this.$resetMessage({
        message: `${title}`,
        type: "success",
      });
    },
    // 错误提示
    error(title) {
      this.$resetMessage.error(`${title}`);
    },
  },
  mounted() {
    // 读取本地存储账号信息
    if (localStorage.getItem("zddl")) {
      this.zddl = true;
      this.email = localStorage.getItem("email");
    }
    if (localStorage.getItem("jzmm")) {
      this.jzmm = true;
      this.password = localStorage.getItem("mm");
    }
    if (localStorage.getItem("email")) {
      this.email = localStorage.getItem("email");
    }
    if (!this.email) {
      document.getElementById("text").focus();
    } else {
      document.getElementById("text2").focus();
    }
  },
};
</script>

4、login_form.css

.login_form{
    -webkit-app-region: drag;
    background-color: #FFFFFF;
 
}
.login_form form {
    padding: 10px 90px 0 90px;
 
}
 
.form_item {
    height: 40px;
    position: relative;
 
}
 
.form_item div {
    float: right;
    margin-right: 5px;
}
 
.form_item i.iconfont {
    position: absolute;
    top: 5px;
 
}
 
.form_item input {
    outline: none;
    border: none;
    padding-left: 30px;
    font-size: 16px;
    width: 230px;
    height: 30px;
    border-bottom: 1px solid #CCC;
    user-select: none;
    -webkit-app-region: no-drag;
}
 
.buttons {
    text-align: center;
}
 
.buttons button {
    background-color: #0786b4;
    border: none;
    width: 250px;
    color: #FFFFFF;
    height: 35px;
    cursor: pointer;
    font-size: 14px;
    border-radius: 4px;
    outline: none;
  -webkit-app-region: no-drag;
  user-select: none;
}
.buttons button:hover {
    background-color: #0aaae4;
    border: none;
    width: 250px;
    color: #FFFFFF;
    height: 35px;
    cursor: pointer;
    font-size: 14px;
    border-radius: 4px;
    outline: none;
    -webkit-app-region: no-drag;
    user-select: none;
}
 
.checkbox {
    display: flex;
    justify-content: center;
    align-items: center;
}
 
.footer {
    display: flex;
    justify-content: space-between;
    padding: 5px 15px 5px 15px;
    align-items: center;
}
 
 
.login_options {
    margin-bottom: 10px;
    margin-top: 5px;
}
 
.login_options .option_item {
    display: inline-block;
    align-items: center;
    width: 13px;
    height: 13px;
    margin-right: 5px;
    position: relative;
    cursor: pointer;
    top: 2px;
    -webkit-app-region: no-drag;
}
 
.login_options .option_item input {
    /* font-size: 13px; */
    -webkit-app-region: no-drag;
}
 
.login_options i.text {
    display: inline-block;
    margin-right: 14px;
    font-size: 13px;
    font-style: normal;
    user-select: none;
    -webkit-app-region: no-drag;
}
 
.login_options .option_item span.checked {
    position: absolute;
    top: -4px;
    right: -3px;
    font-weight: bold;
    display: inline-block;
    width: 20px;
    height: 20px;
    cursor: pointer;
}
 
.option_item span.checked img {
    width: 100%;
    height: 100%;
}
 
input[type="checkbox"]+span {
    opacity: 0;
}
 
input[type="checkbox"]:checked+span {
    opacity: 1;
}
 
.wjmm {
    cursor: pointer;
    color: rgb(139, 134, 134);
}
 
.wjmm:hover {
    cursor: pointer;
    color: rgb(19, 18, 18);
}

5、package.json文件

{
  "name": "qq_test",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "electron:build": "vue-cli-service electron:build",
    "electron:serve": "vue-cli-service electron:serve",
    "postinstall": "electron-builder install-app-deps",
    "postuninstall": "electron-builder install-app-deps"
  },
  "main": "background.js",
  "dependencies": {
    "axios": "^0.27.2",
    "core-js": "^3.8.3",
    "element-ui": "^2.15.9",
    "express": "^4.18.1",
    "qs": "^6.11.0",
    "socket.io": "^4.5.1",
    "socket.io-client": "^3.1.0",
    "vscode-material-icon-theme-js": "^1.0.7",
    "vue": "^2.6.14",
    "vue-router": "^3.5.1",
    "vue-socket.io": "^3.0.10",
    "vuex": "^3.6.2"
  },
  "devDependencies": {
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-vuex": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "electron": "^12.0.0",
    "electron-devtools-installer": "^3.1.0",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "vue-cli-plugin-electron-builder": "~2.1.1",
    "vue-template-compiler": "^2.6.14"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

6、main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
 
import axios from "axios";      //引入axios
 
Vue.prototype.$axios = axios;   //axios跟很多第三方模块不同的一点是它不能直接使用use方法,而是用这种方法
 
//配合文章第4步解释        本地网站
axios.defaults.baseURL = 'http://www.electron.com/index.php/api';//开发环境
 
//引入element组件
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
 
//重写提示框只提示一次
import resetMessage from '@/assets/js/resetMessage'
Vue.prototype.$resetMessage = resetMessage
 
Vue.use(
  new VueSocketIO({
    debug: false, 
    // 宝塔   IP:端口号      (生产环境)
    connection: SocketIO('http://127.0.0.1:3000', {//开发环境
      autoConnect: false // 取消自动连接     
    }),
    extraHeaders: { 'Access-Control-Allow-Origin': '*' }
  })
)
 
//客户端禁止按鼠标返回键返回上一个路由
window.addEventListener('popstate', function() {
  history.pushState(null, null, document.URL)
})
 
Vue.config.productionTip = false
 
new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

7、效果图

本地测试

npm run electron:serve

 

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

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

相关文章

收藏|多指标时序预测方式及时序特征工程总结

背景 现如今&#xff0c;随着企业业务系统越来越复杂&#xff0c;单指标时间序列预测已不能满足大部分企业需求。在复杂的系统内&#xff0c;如果采用单一的指标进行时间序列预测&#xff0c;由于各个指标相互作用的关系&#xff0c;因此会因为漏掉部分指标因素导致出现预测精…

进程间的通信 - 剪切板

剪切板是系统维护管理的一块内存区域&#xff0c;本机的所有进程都可以访问。当一个进程复制数据时&#xff0c;先将数据放在该内存区&#xff0c;当另一个进程粘贴时&#xff0c;则是从该内存区块取出数据 剪切板操作&#xff1a; 其实在剪切板中也就那几个API在使用&#x…

tf模型落地安卓之旧事重提

之前将tf模型落地安卓了&#xff0c;其实就是clone一下官方的代码&#xff0c;然后配置下环境就打包了&#xff0c;没啥技术含量&#xff0c;现在再看&#xff0c;问题就在环境配置了。 1&#xff0c;Unable to start the daemon process. Q Group 277356808 The project use…

西安某1000M3浮顶油罐设计(成品油库1000m³油罐设计与制造工艺)

目 录 1 浮顶油罐及其发展概况 2 2 设计方案 3 2.1 各种设计方法 3 2.2 各种方法优缺点比较 3 2.3 油罐的基础 4 3 罐壁设计 5 3.1 罐壁的强度计算 5 3.2 浮顶油罐的风力稳定计算 6 3.3 浮顶油罐的抗震计算 9 3.4 罐壁结构 14 4 罐底设计 18 4.1 罐底结构设计 18 4.2 罐底的应…

【离散数学】第三章 测试

1.单选题 A&#xff1d;{1,2,3},A上关系R{<1,2>,<2,2>,<2,3>,<3,3>}&#xff0c;则t(R) A. {<1,2>,<2,2>,<2,3>,<3,3>} B. {<1,2>,<1,3>,<2,2>,<2,3>,<3,3>} C. {<1,1>,<2,2>,<…

【面试宝典】Spring Boot 系列面试题

1、什么是 Spring Boot? 多年来&#xff0c;随着新功能的增加&#xff0c;spring 变得越来越复杂。如果必须启动一个新的 Spring 项目&#xff0c;我们必须添 加构建路径或添加 Maven 依赖关系&#xff0c;配置应用程序服务器&#xff0c;添加 spring 配置。 因此&#xff0c…

Vue(九)——页面路由(1)

目录 路由的简介 路由基本使用 几个注意点 嵌套&#xff08;多级&#xff09;路由 路由的query参数 命名路由 路由的params参数 路由的props配置 路由的简介 理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff…

【毕业设计】深度学习身份证识别系统 - 机器视觉 python

文章目录0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择2 算法流程3 部分关键代码4 效果展示5 最后0 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任…

第八章: 项目质量管理

一、规划质量管理 识别项目及其可交付成果的质量要求和标准&#xff0c;并书面描述项目将如何证明符合质量要求和标准的过程。主要作用为整个项目期间如何管理和核实质量提供指南和方向。 输入工具与技术输出 1.项目章程 2.项目管理计划 需求管理计划风险管理计划相关方参与计…

C++ opencv图像直方图

1.图像直方图概念 图像有很多基础概念&#xff0c;在我们学习的过程中因为一些原因无法涉及&#xff0c;但这并不代表它们不重要 今天&#xff0c;我们就来介绍一个概念——图像直方图 图像直方图&#xff0c;是图像处理中很重要的一个基础概念&#xff0c; 有很多的算法&…

用HTML+CSS做一个漂亮简单的旅游网站——旅游网页设计与实现(6页)HTML+CSS+JavaScript

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

(八)Java算法:堆排序(详细图解)

目录一、前言1.1、概念1.2、大根堆特点二、maven依赖三、流程解析3.1、初始建堆3.2、堆化第一步3.2、堆化第二步3.3、堆化第三步3.4、堆化第四步3.5、堆化第五步3.6、堆化第六步四、编码实现4.1、代码实现4.2、运行结果&#xff1a;扩展一、前言 1.1、概念 根据堆的结构可以分…

彩印图文版《Elasticsearch实战》文档,阿里内部共享,堪称精品

学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生的时候…

Lesson1强化学习(RL)初印象 学习笔记

一、强化学习引入 ​ 人的智能可以遗传获得也可以通过后天学习&#xff1b;学习有两种&#xff0c;模仿前人的经验是一种学习&#xff1b;如果没有前人的经验可以学习&#xff0c;就需要和环境进行交互&#xff0c;得到反馈来学习。 #mermaid-svg-XUxguPj6VHcJMK3W {font-famil…

the account is locked

感谢阅读问题描述解决方案1.WinR打开命令行输入&#xff1a;sqlplus &#xff0c;或者使用sqlplus / as sysdba;无需输入密码。2.假设我们要解锁的账户是scott3.修改密码&#xff0c;从而避免再次被锁4.重启服务或者客户端&#xff08;看你是桌面版还是服务器版&#xff09;&am…

警惕,3D建模为什么选3dsMAX不选MAYA

如今现在的游戏建模都是次世代建模&#xff0c;3DMAX确实是主流软件之一&#xff0c;但是为什么说MAYA更好呢❓ 首先&#xff0c;两款软件都很适合用现代的建模&#xff0c;但是难度上有一定的差异❌ • 软件区别 &#x1f340;3DSMAX&#xff1a; 它是目前使用最广泛的3d软…

十、Mysql的DQL语句

Mysql的DQL语句十、Mysql的DQL语句select的查询一、查看系统参数二、select常用函数三、select的单表查询1、from子句2、where子句2.1 where配合等值查询2.2where配合比较操作符(> < > < <>)2.3where配合逻辑运算符(and or )2.4where配合模糊查询2.5where配合…

流量控制可靠传输机制停止-等待协议

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录链路层流量控制和传输层的流量控制区别停止-等待协议为什么要有停止等待协议无差错情况滑动窗口协议后退N帧协议GBN选择重传协议SR可靠传输流量控制&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f3…

供应链全流程计划与排产解决方案核心功能概要

通过数字智能化运营实现将本增效至为重要。 许多企业的业务现状是销售、生产计划与市场不匹配&#xff0c;企业的运营效率低且成本高&#xff1a; 销售计划计划需要大量的人员进行沟通&#xff0c;销售预测的分析维度少、粒度粗&#xff0c;不仅效率低&#xff0c;且预测只是一…

【mycat】常用分片规则

一、 常用分片规则 1、取模 ​ 此规则为对分片字段求摸运算。也是水平分表最常用规则 2、分片枚举 ​ 通过在配置文件中配置可能的枚举 id&#xff0c;自己配置分片&#xff0c;本规则适用于特定的场景&#xff0c;比如有些业务需要按照省份或区县来做保存&#xff0c;而全…