Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Vue.js集成Cesium

发表于 2018-05-11 | 更新于 2019-07-18

近期在研究集成封装Cesium为Vue.js组件,记录一下过程,防止忘了。

安装环境

  • node.js: v8.9.4
  • npm: 5.6.0
  • vue: 2.5.2
  • cesium: 1.45.0
  • vue-cli: 2.9.3
  • webpack: 3.6.0

注意此处vue-cli版本是2,因此该教程不适用vue-cli 3。如需在Vue-cli 3中构建Cesium,请参考Vue-cli 3.0 + cesium 构建.

安装配置

  1. 安装nodejs
  2. 安装vue-cli脚手架
    1
    2
    3
    4
    5
    npm install -g vue-cli
    vue init webpack my-project
    cd my-project
    npm install
    npm run dev
  3. 安装cesium
    1
    npm install --save cesium
  4. webpack配置
  • 在build/webpack.base.conf.js文件中做如下修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    //定义cesium源代码位置
    const cesiumSource = '../node_modules/cesium/Source'
    ...
    module.exports = {
    ...
    output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
    ? config.build.assetsPublicPath
    : config.dev.assetsPublicPath,
    // Needed to compile multiline strings in Cesium
    sourcePrefix: ''
    },
    amd:{
    // Enable webpack-friendly use of require in Cesium
    toUrlUndefined: true
    },
    resolve: {
    extensions: ['.js', '.vue', '.json'],
    alias: {
    'vue$': 'vue/dist/vue.esm.js',
    '@': resolve('src'),
    //设置cesium的别名
    'cesium': path.resolve(__dirname, cesiumSource)
    }
    },
    module: {
    rules: [
    ...
    ],
    //不让Webpack打印载入特定库时候的警告
    unknownContextCritical: false
    },
    ...
    }
  • 在build/webpack.dev.conf.js文件中做如下修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //定义 Cesium 源代码路径,前面没有../
    const cesiumSource = 'node_modules/cesium/Source'
    //定义 Cesium Workers 路径
    const cesiumWorkers = '../Build/Cesium/Workers'
    ...
    plugins: [
    ...
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' } ]),
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets' } ]),
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' } ]),
    new webpack.DefinePlugin({
    // Define relative base path in cesium for loading assets
    CESIUM_BASE_URL: JSON.stringify('')
    })
    ...
    ]
  • 在build/webpack.prod.conf.js文件中做如下修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    //定义 Cesium 源代码路径,前面没有../
    const cesiumSource = 'node_modules/cesium/Source'
    //定义 Cesium Workers 路径
    const cesiumWorkers = '../Build/Cesium/Workers'
    ...
    plugins: [
    ...
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, cesiumWorkers), to: 'Workers' } ]),
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Assets'), to: 'Assets' } ]),
    new CopyWebpackPlugin([ { from: path.join(cesiumSource, 'Widgets'), to: 'Widgets' } ]),
    new webpack.DefinePlugin({
    //定义 Cesium 从哪里加载资源,如果使用默认的'',却变成了绝对路径了,所以这里使用'./',使用相对路径
    CESIUM_BASE_URL: JSON.stringify('./')
    })
    ...
    ]

Vue.js组件编写

  • 在src/components下新建 CesiumViewer.vue vue组件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <template>
    <div id="cesiumContainer">
    </div>
    </template>
    <script type="text/javascript">
    import Cesium from 'cesium/Cesium'
    import widgets from 'cesium/Widgets/widgets.css'

    export default {
    name: 'CesiumViewer',
    mounted () {
    var viewer = new Cesium.Viewer('cesiumContainer')
    }
    }

    </script>
    <style rel="stylesheet/scss" lang="scss" scoped>
    #cesiumContainer {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    overflow: hidden;
    }
    </style>
  • 创建全局样式文件src/styles/index.scss,做如下修改
    1
    2
    3
    4
    5
    6
    7
    8
    html,
    body {
    width: 100%;
    height: 100%;
    margin: 0;
    padding: 0;
    overflow: hidden;
    }
  • 在src/main.js中做如下修改
    1
    import '@/styles/index.scss' // global css

参考链接

  1. 基于webpack 构建Cesium + Vue 的应用, by QingMings
  2. Vue-cli 3.0 + cesium 构建,by QingMings.
  3. cesium-and-webpack, by cesiumjs.org
  4. vue-cli生成的项目,main.js引入scss时报错,by segmentfault.

离线环境下Node.js应用部署方法

发表于 2018-05-10 | 更新于 2019-12-17

离线环境下Node.js应用部署时需要解决以下三个基本问题:

  1. Node.js应用的进程管理,如性能监控、自动重启、负载均衡等
  2. Node.js应用开机如何自启动
  3. 离线环境下如何部署Node.js应用

下面以在Windows Server 2012上离线部署Node.js应用为例,记录上述问题的解决方案:

Node.js应用的进程管理

在生产环境中运行 Express 应用程序时,使用进程管理器对于完成以下任务很有帮助[1]:

  • 在应用程序崩溃后将其重新启动。
  • 获得对运行时性能和资源消耗的洞察。
  • 动态修改设置以改善性能。
  • 控制集群。

进程管理器有点类似于应用程序服务器:它是应用程序的“容器”,可促进部署,提供高可用性并使您可以在运行时管理应用程序。

用于 Express 和其他 Node.js 应用程序的最流行的进程管理器包括:

  • StrongLoop Process Manager
  • PM2
  • Forever

上述三种工具的比较请参阅http://strong-pm.io/compare/。其中,StrongLoop Process Manager无法在Windows平台工作,再综合比较PM2和Forever,由于Forever没有操作系统自启动的脚本,故选择PM2作为Windows平台Node.js应用的进程管理器。

Node.js应用开机如何自启动

选择PM2作为Node.js应用的进程管理器后,Node.js应用开机自启动的问题就变为如何开机自启动PM2。Windows平台存在两个自启动PM2的脚本:

  • pm2-windows-service
  • pm2-windows-startup

pm2-windows-service基于 node-windows将PM2注册为Windows服务,从而实现自启动。pm2-windows-startup则基于start-on-windows-boot在注册表中将PM2设为自启动程序,从而实现自启动。两种方案经测试,只有pm2-windows-startup在Windows Server 2012上可行,故选择pm2-windows-startup作为解决Node.js应用开机自启动的方案。

离线环境下如何部署Node.js应用

PM2和pm2-windows-startup必须全局安装,如何简单方便地在离线环境下全局安装这两个模块是一个问题。网上搜到的方法有:

  • npm link
  • npm-bundle

npm link[2]是npm的一个命令,可将本地包链接成全局包,但实际测试过程中,无法解决PM2包的依赖问题,故放弃。而npm-bundle[3]则能很好的解决PM2的依赖问题。具体过程为:

1
2
3
4
5
6
\\在线环境下全局安装
npm install -g pm2
npm install -g pm2-windows-startup
npm install -g npm-bundle
npm-bundle pm2
npm-bundle pm2-windows-startup

离线部署Nodejs Express应用

1
2
3
4
5
6
7
@echo off
SET NODE_ENV=production
call npm install .\pm2-2.10.3.tgz -g
call npm install .\pm2-windows-startup-1.0.3.tgz -g
call pm2-startup install
call pm2 start ./bin/www -i 0
call pm2 save

离线卸载Nodejs Express应用

1
2
3
4
5
@echo off
call pm2 stop all
call pm2-startup uninstall
call npm uninstall pm2 -g
call npm uninstall pm2-windows-startup -g

参考链接

  1. Express 应用程序的进程管理器, by Express
  2. npm离线安装全局包,内网安装npm中的包, by 爱死费崇政
  3. What exact command is to install pm2 on offline RHEL, by stackoverflow.
  4. NodeJS: PM2 Startup on Windows,by Walter Accantelli.
  5. bat脚本%cd%和%~dp0获取当前目录区别,by dmfrm

Vue.js集成Highcharts

发表于 2018-05-10 | 更新于 2019-09-03

Vue.js集成Highcharts方法

  1. 安装highcharts
    1
    npm install --save highcharts
  2. 封装hightcharts成Vue.js组件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <template>
    <div class="highcharts-container">
    </div>
    </template>
    <script>
    import Highcharts from 'highcharts/highstock'
    import HighchartsMore from 'highcharts/highcharts-more'
    import HighchartsDrilldown from 'highcharts/modules/drilldown'
    import Highcharts3D from 'highcharts/highcharts-3d'
    HighchartsMore(Highcharts)
    HighchartsDrilldown(Highcharts)
    Highcharts3D(Highcharts)

    export default {
    props: ['options'],
    name: 'HighCharts',
    data () {
    return {
    chart: null
    }
    },
    watch: {
    options: function (newVal, oldVal) { // watch it
    this.chart.update(newVal, true)
    }
    },
    mounted () {
    this.initChart()
    },
    methods: {
    initChart () {
    this.chart = new Highcharts.Chart(this.$el, this.options)
    }
    }
    }

    </script>
  3. 在src/main.js引入组件
    1
    2
    import HighCharts from './components/HighCharts.vue'
    Vue.component('HighCharts', HighCharts)
  4. 使用组件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    <template>
    <div class="radarGraph">
    <HighCharts :options="options" class="radar" ></HighCharts>
    </div>
    </template>
    <script>

    export default {
    name: 'RadarGraph',
    computed: {
    gameInfo () {
    return this.$store.state.gameInfo
    },
    options () {
    return {

    chart: {
    polar: true,
    type: 'line',
    marginTop: 0,
    marginBottom: 0,
    marginLeft: 0,
    marginRight: 0
    },

    credits: {
    enabled: false
    },

    pane: {
    size: '75%'
    },

    title: null,

    legend: {
    enabled: false
    },

    xAxis: {
    categories: ['分类1', '分类2', '分类3', '分类4',
    '分类5', '分类6'
    ],
    labels: {
    style: {
    fontSize: '14px'
    }
    },
    tickmarkPlacement: 'on',
    lineWidth: 0
    },

    yAxis: {
    gridLineInterpolation: 'polygon',
    lineWidth: 0,
    min: 0
    },

    series: [{
    type: 'area',
    name: '得分',
    data: [this.gameInfo.radar1, this.gameInfo.radar2, this.gameInfo.radar3, this.gameInfo.radar4, this.gameInfo.radar5, this.gameInfo.radar6],
    pointPlacement: 'on'
    }]
    }
    },
    ...mapGetters([
    'userId'
    ])
    },
    created () {
    this.fetchData()
    },
    methods: {
    fetchData () {
    this.$store.dispatch('GetGameInfo', this.userId)
    }
    }
    }

    </script>
    参考链接

  1. 在 Vue 中使用 Highcharts,by 简数科技.

Vue.js集成Socket.io

发表于 2018-05-09 | 更新于 2018-06-03

Socket.IO简介

Socket.IO 是一个面向实时 web 应用的 JavaScript 库。它使得服务器和客户端之间实时双向的通信成为可能。他有两个部分:在浏览器中运行的客户端库,和一个面向Node.js的服务端库。两者有着几乎一样的API。像Node.js一样,它也是事件驱动的.

Socket.IO 主要使用WebSocket协议。但是如果需要的话,Socket.io可以回退到几种其它方法,例如Adobe Flash Sockets,JSONP拉取,或是传统的AJAX拉取,[2]并且在同时提供完全相同的接口。尽管它可以被用作WebSocket的包装库,它还是提供了许多其它功能,比如广播至多个套接字,存储与不同客户有关的数据,和异步IO操作。

Vue.js集成Socket.IO

  1. 安装socket.io-client
    1
    npm install --save socket.io-client
  2. 在src/main.js中载入socket.io-client
    1
    2
    3
    import io from 'socket.io-client'
    const socket = io(process.env.BASE_API)
    Object.defineProperty(Vue.prototype, '$socket', { value: socket })
  3. 在Vuejs组件中使用socket.io-client
    1
    this.$socket.on('event',function(e){})
    参考链接

  1. https://zh.wikipedia.org/wiki/Socket.IO, by Wikipedia
  2. https://socket.io/get-started/chat/, by socket.io

PowerDesigner使用经验总结

发表于 2018-05-09 | 更新于 2023-02-10

需求分析

在系统工程及软件工程中,需求分析指的是在创建一个新的或改变一个现存的系统或产品时,确定新系统的目的、范围、定义和功能时所要做的所有工作。需求分析是软件工程中的一个关键过程。在这个过程中,系统分析员和软件工程师确定顾客的需要。只有在确定了这些需要后他们才能够分析和寻求新系统的解决方法。

在软件工程的历史中,很长时间里人们一直认为需求分析是整个软件工程中最简单的一个步骤,但在过去十年中越来越多的人认识到它是整个过程中最关键的一个过程。假如在需求分析时,分析者们未能正确地认识到顾客的需要的话,那么最后的软件实际上不可能达到顾客的需要,或者软体无法在规定的时间里完工。

软件设计

软件设计是从软件需求规格说明书出发,根据需求分析阶段确定的功能设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及编写具体的代码,形成软件的具体设计方案。

软件设计是把许多事物和问题抽象起来,并且抽象它们不同的层次和角度。将问题或事物分解并模块化使得解决问题变得容易,分解的越细模块数量也就越多,它的副作用就是使得设计者考虑更多的模块之间耦合度的情况。

UML

统一建模语言(英语:Unified Modeling Language,缩写UML)是一种开放的方法,用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的开放方法。UML展现了一系列最佳工程实践,这些最佳实践在对大规模,复杂系统进行建模方面,特别是在软件架构层次已经被验证有效。

这个语言由葛来迪·布区,伊瓦尔·雅各布森与詹姆士·兰宝于1994年至1995年间,在Rational Software公司中开发,于1996年,又进一步发展。UML集成了Booch,OMT和面向对象软件工程的概念,将这些方法融合为单一的,通用的,并且可以广泛使用的建模语言。UML打算成为可以对并发和分布式系统的标准建模语言。

在UML系统开发中有三个主要的模型:

  • 功能模型:从用户的角度展示系统的功能,包括用例图。
  • 静态模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。
  • 动态模型:展现系统的内部行为。包括序列图,活动图,状态图。)

PowerDesigner工具

PowerDesigner是Sybase的企业建模和设计解决方案,采用模型驱动方法,将业务与IT结合起来,可帮助部署有效的企业体系架构,并为研发生命周期管理提供强大的分析与设计技术。

PowerDesigner独具匠心地将多种标准数据建模技术(UML、业务流程建模以及市场领先的数据建模)集成一体,并与 .NET、WorkSpace、PowerBuilder、Java™、Eclipse 等主流开发平台集成起来,从而为传统的软件开发周期管理提供业务分析和规范的数据库设计解决方案。此外,它支持60多种关系数据库管理系统(RDBMS)/版本[来源请求]。PowerDesigner运行在Microsoft Windows平台上,并提供了Eclipse插件。

PowerDesigner使用经验

遵循UML方法,使用PowerDesigner对系统进行建模。

在需求分析阶段,通常使用用例图、序列图(序列图中主要描述用户与系统之间交互关系)、组合结构图、类图(用于描述组件或类的接口及其调用关系)等UML图描述。

在设计阶段,从架构设计、概要设计到详细设计,粒度由粗到细。

通常架构设计是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。
架构设计通常使用组织结构图、对象图、活动图、状态图等UML图描述。

概要设计就是设计软件的结构,包括组成模块,模块的层次结构,模块的调用关系,每个模块的功能等等。同时,还要设计该项目的应用系统的总体数据结构和数据库结构,即应用系统要存储什么数据,这些数据是什么样的结构,它们之间有什么关系。概要设计从模块角度描述系统,通常使用组合结构图进行描述。

详细设计就是为每个模块完成的功能进行具体的描述,要把功能描述转变为精确的、结构化的过程描述。如采用面向对象的开发方法,详细设计通常使用UML类图描述。

状态图绘制

请参考PowerDesigner16 状态图。

参考链接

  1. 统一建模语言,by wikipedia.
  2. Power Designer 概念数据模型导出 逻辑数据模型和物理数据模型 生成数据库脚本,by 子澈课堂.
  3. PowerDesigner使用教程,by 芝麻软件.
  4. PowerDesigner使用教程-使用PowerDesigner创建应用架构图的,by 常山造纸农.
  5. PowerDesigner使用,by 写程序的小王叔叔.
  6. PowerDesigner16 状态图,by 猪脚踏浪.

Vue.js集成Bootstrap4

发表于 2018-05-09 | 更新于 2019-08-22

记录在Vue.js中集成Bootstrap4的方法,防止忘了!

环境配置

  • vue-cli: 2.x

集成过程

  1. 创建Vue.js工程
    1
    2
    npm install -g vue-cli
    vue init webpack project_name
  2. 安裝 Sass-loader / node-sass
    1
    npm install sass-loader node-sass --save-save
  3. 安裝BootStrap / jQuery / Popper
    1
    npm install bootstrap jquery popper.js --save
  4. 配置build/webpack.base.conf.js
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    module.exports = {
    ...
    // 新增plugins
    plugins: [
    new webpack.ProvidePlugin({
    '$': "jquery",
    'jQuery': "jquery",
    'Popper': 'popper.js'
    })
    ],
    ...
    }
  5. 在src/main.js中载入Bootstrap
    1
    2
    import 'bootstrap'
    import 'bootstrap/dist/css/bootstrap.css'
  6. 使用Bootstrap和sass编写Vue.js组件

参考链接

  1. Bootstrap Webpack,by bootstrap homepage.
  2. Setup Bootstrap 4 With Vue Cli 3 Webpack,by lua software code.
  3. Adding Bootstrap to a Vue CLI Project,by Travis Horn.

Linux MySQL 终端操作

发表于 2018-05-08 | 更新于 2022-06-24
  1. 进入mysql数据库

    1
    #mysql -uroot -proot
  2. 创建mysql user

    1
    2
    MariaDB [(none)]> create user 'stock'@'localhost' identified by 'stock';
    Query OK, 0 rows affected (0.00 sec)
  3. 查询mysql用户

    1
    2
    3
    4
    5
    6
    7
    8
    MariaDB [(none)]> SELECT User,Host FROM mysql.user;
    +-------+-----------+
    | User | Host |
    +-------+-----------+
    | root | localhost |
    | stock | localhost |
    +-------+-----------+
    2 rows in set (0.00 sec)
  4. 授予mysql用户权限

    1
    2
    MariaDB [(none)]> GRANT ALL ON stock.* TO 'stock'@'localhost';
    Query OK, 0 rows affected (0.00 sec)
  5. 使用show语句查找数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database |
    +--------------------+
    | information_schema |
    | mysql |
    | performance_schema |
    +--------------------+
    3 rows in set (0.00 sec)
  6. 创建数据库stock

    1
    2
    MariaDB [(none)]> create database stock;
    Query OK, 1 row affected (0.00 sec)
  7. 选择创建的数据库

    1
    2
    MariaDB [(none)]> use stock;
    Database changed
  8. 使用show语句查找数据库中的表

    1
    MariaDB [stock]> show tables;
  9. 删除创建的数据库

    1
    2
    MariaDB [(none)]> drop database stock;
    Query OK, 0 rows affected (0.00 sec)
  10. 删除表

    1
    2
    mysql> drop table sequelizemeta;
    Query OK, 0 rows affected (0.01 sec)
  11. 查询表结构

    1
    mysql> desc t_records;
  12. 清除表记录

    1
    mysql> delete from t_records;
  13. 修改数据库账号密码

1
mysqladmin -uroot -p123456 password 123

参考链接

  1. 什么是 MySQL 索引?,by 小灰.
  2. mysql修改用户密码的方法及命令,by 剩余价值.

侠客行

发表于 2018-05-08 | 更新于 2018-05-10
作者:李白 赵客缦胡缨,吴钩霜雪明。 银鞍照白马,飒沓如流星。 十步杀一人,千里不留行。 事了拂衣去,深藏身与名。 闲过信陵饮,脱剑膝前横。 将炙啖朱亥,持觞劝侯嬴。 三杯吐然诺,五岳倒为轻。 眼花耳热后,意气素霓生。 救赵挥金锤,邯郸先震惊。 千秋二壮士,烜赫大梁城。 纵死侠骨香,不惭世上英。 谁能书阁下,白首太玄经。

立功立德立言

发表于 2018-05-08 | 更新于 2018-12-05

来源:《左传》
二十四年春,穆叔如晋。范宣子逆之,问焉,曰:“古人有言曰:‘死而不朽’,何谓也?”穆叔未对。宣子曰:“昔匄之祖,自虞以上为陶唐氏,在夏为御龙氏,在商为豕韦氏,在周为唐杜氏,晋主夏盟为范氏,其是之谓乎?”穆叔曰:“以豹所闻,此之谓世禄,非不朽也。鲁有先大夫曰臧文仲,既没,其言立,其是之谓乎!豹闻之,‘太上有立德,其次有立功,其次有立言’,虽久不废,此之谓不朽。若夫保姓受氏,以守宗祊,世不绝祀,无国无之,禄之大者,不可谓不朽。

上一页1…5152

Jack Huang

519 日志
66 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse