`

electron.js数据库应用---导航菜单(element-ui+mysql)

阅读更多
一、环境搭建
  略,请见https://wallimn.iteye.com/blog/2437140

二、MySQL数据库脚本
create table t_menu(
    id int primary key auto_increment,
    tree_id int ,
    tree_pid int, 
    title varchar(60), 
    url varchar(255),
    target varchar(60), 
    icon varchar(255),
    remark varchar(255)
) default charset = utf8 ;

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(1,0,'系统管理','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(2,1,'用户管理','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(3,1,'角色管理','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(4,1,'功能管理','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(5,0,'业务管理','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(6,5,'JAVA业务','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(7,5,'JavaScript业务','about:blank','main',null,null);

insert into t_menu(tree_id,tree_pid,title,url,target,icon,remark)
values(8,5,'C#业务','about:blank','main',null,null);


二、后台JS
(一)数据库基础类db.js
var mysql = require('mysql');

// 创建一个数据库连接池
var pool = mysql.createPool({
  connectionLimit: 50,
  host:"127.0.0.1",
  port:"3306",
  user: "root",
  password: "",
  database: "test"
});

/**
 * 执行SQL,增、删、改、查全用这一个函数
 * 参数:
 *  sql:要执行的SQL语句
 *  P:参数,如果没有可不传,可以是数组或对象类型
 *  C:回调函数,执行成功后调用的语句
 */
exports.query = function (sql, P, C) {
  var params = [];
  var callback;

  if (arguments.length == 2 && typeof arguments[1] == 'function') {
    callback = P;
  } else if (arguments.length == 3 && Array.isArray(arguments[1]) && typeof arguments[2] == 'function') {
    params = P;
    callback = C;
  } else {
    //会导致程序崩溃退出。
    throw new Error('对不起,参数个数不匹配或者参数类型错误');
  }


  // 从池子里面拿一个可以使用的连接
  pool.getConnection(function (err, connection) {
    if(err){
      callback.apply(null,[err]);
      return;
    }
    
    connection.query(sql, params, function () {
      // 使用完毕之后,将该连接释放回连接池
      connection.release();
      callback.apply(null, arguments);
    });
  });
};


(二)后台服务类dbservice.js
var db = require("./db.js");

/*
 * 数据库服务类。
 */

/**
 *生成导航菜单
 *
 * @param {*} callback 回调函数
 */
function selectNavMenus(callback){
    db.query("select * from t_menu  order by tree_pid,tree_id",function(error,results){
        if(error){
            callback(error);
        }
        else{
            var treeArray = resultsToTreeArray(results);
            callback(null,treeArray);
        }
        //callback.apply(null,arguments);
    });
}

/**
 *转化为导航菜单使用的数组,只考虑了菜单分两级。
 *
 * @param {*} error
 * @param {*} results
 * @returns
 */
function resultsToTreeArray(results){
    var treeArray = [];
    var len = results.length;
    for(var i=0;i<len; i++){
        if(results[i].tree_pid===0){//根的ID为0
            results[i].children=[];
            treeArray.push(results[i]);
        }
    }
    for(var j=0; j<treeArray.length;j++){
        for(var i=0;i<len; i++){
            if(results[i].tree_pid===treeArray[j].tree_id){
                treeArray[j].children.push(results[i]);
            }
        }
    }
    return treeArray;
}


module.exports = {
    "selectNavMenus":selectNavMenus,
    "author":'wallimn',
    "version":'20190204'
}


三、前端页面navmenu.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>electron.js+mysql示例, by wallimn, 2019-02-05</title>
    <link rel="stylesheet" type="text/css" href="./libs/element-ui.v2.4.9/theme-chalk/index.css">
    <style>
        body,html,#app{
          height:100%;
          margin:0;
        }
      </style>
  </head>
  <body>
    <div id="app">
      <el-menu :default-active="activeIndex" class="el-menu-main" mode="horizontal" background-color="#545c64" text-color="#fff"
        active-text-color="#ffd04b" @select="handleSelect">
        <template v-for="item in menus">
          <template v-if="item.children.length==0">
            <el-menu-item :index="'mi'+item.id" :key="item.id">{{item.title}}</el-menu-item>
          </template>
          <template v-else>
            <el-submenu v-if="item.children.length>0" :index="'mi'+item.id" :key="item.id">
              <template slot="title">{{item.title}}</template>
              <el-menu-item v-for="subitem in item.children" :key="subitem.id" :index="'mi'+subitem.id">{{subitem.title}}</el-menu-item>
            </el-submenu>
          </template>
        </template>
      </el-menu>
    </div>
    
    <script type="text/javascript" src="./libs/vue.js"></script>

	  <!-- 引入组件库 -->
	  <script src="./libs/element-ui.v2.4.9/index.js"></script>
    <script type="text/javascript">
      // Vue实例化
      var doit = new Vue({
        el:'#app',
        data: function(){
          return {
            menus:[],
            activeIndex:"1",
            service:require('./dbservice.js')
          };
        },
        created:function(){
          this.loadMenuData();
        },
        methods: {
          loadMenuData:function(){
            var self = this;
            //var db = require('./db');
            self.service.selectNavMenus(function(err,rows){
              if(err){
                console.error(err);
              }
              else{
                var len = rows.length;
                self.menus = [];
                for(var i=0; i<len; i++ ){
                  self.menus.push(rows[i]);
                }
                if(len>0){
                  if(self.menus[0].children.length==0){
                    self.activeIndex="mi"+self.menus[0].id;
                  }
                  else{
                    self.activeIndex = "mi"+self.menus[0].children[0].id;
                  }
                  console.log("设置当前菜单:"+self.activeIndex);
                }
              }
            });

          }
        }	//end of methods		
      });
   
    </script>
  </body>
</html>
分享到:
评论

相关推荐

    electron.js数据库应用---入门(mysql+element-ui)

    标题 "electron.js数据库应用---入门(mysql+element-ui)" 指的是一个教程或者项目,它涵盖了使用Electron.js框架创建桌面应用程序,并结合MySQL数据库和Element-UI库进行数据管理的入门知识。 Electron.js是一个流行...

    Electron项目中通过electron-vue + electron-builder + electron-updater实现远程更新(包含源码)

    `electron-vue`是基于Vue.js和Electron的集成开发环境,它为Electron应用提供了Vue的开发支持。它包含了Vue CLI工具、Webpack配置、Vue Router、Vuex等,使得在Electron环境中开发Vue应用变得更加简单。通过`...

    Vue+Electron(electron-builder + electron-updater + electron-log)

    使用Vue+Electron(electron-builder + electron-updater + electron-log)实现桌面应用程序的开发,面向所有electron使用者学习使用,内部源码都有注释。可参考文章(http://t.csdn.cn/BLM6Y)使用。

    electron-vue + vue-cli + element-ui 实时热更新版v12.0.4框架.rar

    electron-vue + vue-cli + element-ui 实时热更新版,electronv12.0.4框架,打包好的框架,拿来即用,实时热更新,提高开发3倍效率

    electron打包资源下载30.0.9/electron-v30.0.9-win32-ia32.zip

    标题 "electron打包资源下载30.0.9/electron-v30.0.9-win32-ia32.zip" 指的是一个用于 Electron 应用程序打包的资源包,版本为30.0.9,适用于Windows操作系统,32位架构。这个资源包包含了构建和运行基于Electron...

    winCodeSign-2.4.0.zip+electron-v2.0.18-win32-x64+nsis-3.0.3.2.zip

    Electron是由GitHub开发的,它结合了Chromium浏览器和Node.js环境,允许开发者使用HTML、CSS和JavaScript来构建原生桌面应用。这里的"win32-x64"表示这是针对Windows 64位系统的构建。Electron使得开发者能够利用Web...

    vue+element-ui.rar

    Element-UI则是一个基于Vue.js的组件库,提供了丰富的UI组件,如表格、按钮、对话框、下拉菜单等,用于快速构建美观的企业级应用界面。 Vue.js的核心特性包括其声明式的编程方式、虚拟DOM、组件化开发以及强大的...

    Electron.Fiddle-darwin-x64-0.11.1.zip

    通过结合 Chromium 和 Node.js 的功能,Electron 实现了在桌面环境中运行 web 应用的可能,极大地简化了桌面应用的开发流程。 Fiddle 在这里扮演的是一个实验台的角色,它提供了一个简洁的界面,让开发者可以快速...

    【最新版】Electron.Fiddle-darwin-x64-0.15.1.zip【亲测可用】最好的 Electron 入门方式

    你可以使用 Electron Fiddle 创建并运行小段 Electron 程序,从一个简单的模板开始,随心所欲地挥洒你的创意,选择一个 Electron 版本欣赏运行效果。最后,你可以将其下载保存,或推送 GitHub Gist 上,所有人都可以...

    electron-v22.3.27-win32-x64.zip

    Electron允许开发者使用Web技术(如HTML、CSS和JavaScript)来创建桌面应用,同时提供了Node.js环境以实现后台功能。 描述中同样提到"electron-v22.3.27-win32-x64.zip",意味着这是一个zip压缩包,包含了运行...

    electron-v16.0.6-win32-x64

    electron 打包时每次都会下载一遍相应版本的包,这里我们可以利用打包命令直接读取本地的包,节省打包时间 electron-packager ./ electron-beian --win --arch=x64 --out ../outputs --electron-zip-dir=../electron...

    electron-quick-start-master 快速入门教程

    electron-quick-start-master 快速入门教程electron-quick-start-master 快速入门教程electron-quick-start-master 快速入门教程electron-quick-start-master 快速入门教程electron-quick-start-master 快速入门教程...

    electron-vue + vue-cli + element-ui 实时热更新版v2.0.18框架.rar

    electron-vue + vue-cli + element-ui 实时热更新版,electronvv2.0.18框架,打包好的框架,拿来即用,实时热更新,提高开发3倍效率

    electron打包全家桶,electron-v8.5.5-win32-x64,nsis-3.0.4.2,winCodeSign-2.6.0

    新下载得electron项目打包时经常会出错,是由于依赖环境不完善原因造成的,主要是缺少标题里的三样。下载后拷贝到C:\Users\XXX\AppData\Local\electron\Cache下使用

    Node.js-electron-serve为Electronapps提供静态文件服务

    在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程。而Electron是GitHub开发的一款开源框架,它允许我们使用Web技术(如HTML、CSS和JavaScript)构建跨...

    Node.js-electron-simple-updater自动更新electron应用

    标题 "Node.js-electron-simple-updater自动更新electron应用" 指的是使用 Electron 框架结合 Node.js 开发桌面应用程序时,利用 `electron-simple-updater` 这个库来实现应用的自动化更新功能。Electron 是一个允许...

    electron插件:electron-v20.1.1-win32-zip下载

    标签中包含的“nodejs”,表明Electron是基于Node.js的,这意味着在Electron应用中,开发者可以使用Node.js的API和模块,实现后台数据处理、文件操作等功能。 压缩包内的文件名列表揭示了Electron运行所需的组件和...

    electron-v28.1.0-win32-x64

    综上所述,这个压缩包包含了一个完整的Electron运行环境,包括JavaScript引擎、图形库、多媒体处理工具以及跨平台图形API的实现,这些都是构建和运行基于Electron的桌面应用所必需的组件。开发者可以使用这个包来...

Global site tag (gtag.js) - Google Analytics