#!/bin/bash
#Date:2018-01-08
#Author:xxxxxx
#Function:xxxxxx
#Change:2018-01-17
# #设置忽略CTRL+C信号
trap 'my_exit;exit' SIGINT SIGTERM SIGQUIT #开启DEBUG模式
#set -x #如果有命令执行返回值为非0,那么脚本将结束,不再继续执行
# set -e #导入rsync使用的密码
export RSYNC_PASSWORD='xxxxxx' #设置脚本涉及的目录变量
pathdir=$(cd $(dirname $0);pwd)
#源主机同步到本机的临时目录
tmpdir='/data/migrate_tmp'
# tmpdir='/data/migrate_tmp/tmp' #测试用
#管理机
domain_m=("cms.domain.com" "pic.domain.com")
youxi_m=("/data1/www/abc.test.com" "/data1/www/pic.domain.com")
# youxi_m=("/data/migrate_tmp/abc.test.com" "/data/migrate_tmp/pic.domain.com") #测试用
#模板机
domain_t='cms.domain.com'
youxi_t='/data2/www/abc.test.com'
#web机
domain_web=''
youxi_web='/data/webapps'
#youxi_web='/data/migrate_tmp/webapps' #测试用
#图片机
domain_pic='pic.domain.com'
youxi_pic='/data/webapps/pic.domain.com' #判断临时目录是否存在,若不存在则创建
[ -d ${tmpdir} ] && rm -rf ${tmpdir}/* || mkdir -p ${tmpdir} #备份目录
# [ -d /data/fabuqi_bak ] && mkdir /data/fabuqi_bak #进入到脚本所在的目录
cd ${pathdir} #定义grep查找需要替换的文件列表正则
grep_re="img.dwstatic.com|img[1-5].dwstatic.com|pic[1-5].domain.com|pic[0-5]1.domain.com|public.domain.com|pic.domain.(com|cn)" #trap的执行函数
function my_exit(){
echo trap_handle_time: $(date "+%Y-%m-%d %H:%M:%S")
echo "exit"
} #脚本使用说明函数
function usage(){
echo "Usage: $0 [OPTIONS]"
echo " - Here to display help info ."
echo " - The args is only two ."
echo " - OPTIONS: [ all | zhuanqu_ID | 专区ID ] ."
echo " example: /bin/bash migrate.sh zxyzxy "
exit 1
} #logger function
function log_info(){
DATA_N=$(date "+%Y-%m-%d %H:%M:%S")
USER_N=$(whoami)
echo "${DATA_N} ${USER_N} execute $0 [INFO] $@" | tee -a ${pathdir}/migrate.log
} #配置变量函数,sync_dir是同步的源主机子目录,destdir是新发布器目标目录。
function config_and_rsync_single(){
#从源主机的哪个机器同步数据
rsync_from=${2}
#目标同步的目录
if [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
#拉取单个专区文件资源,保留文件时间属性
for i in `seq 0 $(expr ${#domain_m[*]} - 1)`
do
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_m[$i]}
destdir=${youxi_m[$i]}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,如果临时目录已经存在,就直接拷贝文件,如果不存在就创建临时目录在拷贝目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
[ -d ${tmpdir}/${sync_dir} ] && \cp -rpvu ${destdir}/* ${tmpdir}/${sync_dir} 2>>${pathdir}/migrate.log || mkdir -p ${tmpdir}/${sync_dir} && \cp -rpvu ${destdir}/* ${tmpdir}/${sync_dir} 2>>${pathdir}/migrate.log log_info "Start to get ${1} files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/${1} ${tmpdir}/${sync_dir} | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_single_id function ......"
update_single_id ${tmpdir}/${sync_dir} ${1} ${destdir}
done
log_info "建立专区对应的软连接 ..."
ln -nfs /data1/www/abc.test.com/${id} /data1/webapps/${id}.domain.com 2>>${pathdir}/migrate.log
chown -R www-data:www-data /data1/webapps/${id}.domain.com
elif [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_t}
destdir=${youxi_t}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir} 2>>${pathdir}/migrate.log log_info "Start to get ${1} files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/${1} ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_single_id function ......"
update_single_id ${tmpdir} ${1} ${destdir}
log_info "建立专区对应的软连接 ..."
ln -snf ${destdir}/${id} /data/data1/www/abc.test.com/${id}.domain.com 2>>${pathdir}/migrate.log
chown -R www-data:www-data /data/data1/www/abc.test.com/${id}.domain.com
elif [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_web}
destdir=${youxi_web}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir} 2>>${pathdir}/migrate.log log_info "Start to get ${1} files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${1}.domain.com ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_single_id function ......"
update_single_id ${tmpdir} ${1}.domain.com ${destdir} log_info "Start to backup ${1} nginx configure file......"
[ -d /data/services/nginx_vhost_bak ] || mkdir -p /data/services/nginx_vhost_bak
\cp -pvu /data/services/nginx_vhost/${1}.*.conf /data/services/nginx_vhost_bak/ 2>>${pathdir}/migrate.log
log_info "Start to rsync ${1} nginx configure file ......"
rsync -avuzt game_test@${rsync_from}::nginx_test/${1}.*.conf /data/services/nginx_vhost/
log_info "update the ${1} nginx conf,please to reload nginx service by manual ..."
# service nginx reload
else
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_pic}
destdir=${youxi_pic}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir} 2>>${pathdir}/migrate.log log_info "Start to get ${1} files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/${1} ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_single_id function ......"
update_single_id ${tmpdir} ${1} ${destdir}
fi
} #迁移单个专区函数
function update_single_id(){
_tmpdir=${1}
id=${2}
_destdir=${3}
cd ${_tmpdir}
log_info "replace contexts in the files that in the ${id} directory ..."
#判断目录是否为空
if [ "`ls -A ${_tmpdir}/${id}`" = "" ]; then
log_info "the ${id} is indeed empty."
#判断目录及其子目录是否为空
elif [ "`find ${_tmpdir}/${id}/* -type f`" = "" ]; then
log_info "the ${id} and subdir are empty."
#判断是否有文件需要做内容替换
elif [ "`grep -rEl ${grep_re} ${_tmpdir}/${id}/*`" = "" ]; then
log_info "the ${id} not files need to replace."
#不为空时执行修改文件内容操作
else
log_info "Start to sed ......"
sed -i -e 's/img\.dwstatic\.com/img\.game\.dwstatic\.com/g' \
-e 's/img\(.\)\.dwstatic\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/pic\(.\)\.domain\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/pic01\.domain\.com/img\.game\.dwstatic\.com/g' \
-e 's/pic\(.\)\(.\)\.domain\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/public\.domain\.com/publicgame\.domain\.com/g' \
-e 's/pic\.domain\.\(com\|cn\)/img\.game\.dwstatic\.com/g' $(grep -rEl ${grep_re} ${_tmpdir}/${id}/*)
fi if [ -d ${_destdir}/${id} ];then
log_info "the ${id} is a exist id,backup old ${id} dirs ..."
[ -d /data/fabuqi_bak/${id}_bak ] && log_info "the ${id}_bak is exist,not need to backup ..." || cp -rfp ${_destdir}/${id} /data/fabuqi_bak/${id}_bak
log_info "replace old ${id} dirs by new ${id} dirs ..."
#同步专区目录到新发布器目标目录中,只会在源文件的更改时间较目标文件更新时或是目标文件并不存在时,才复制文件,保留文件时间属性
\cp -rpvu ${_tmpdir}/${id}/* ${_destdir}/${id}/ | tee -a ${pathdir}/migrate.log
chown -R www-data:www-data ${_destdir}/${id}
else
log_info "the ${id} is a new id,not to backup."
#同步专区目录到新发布器目标目录中
\cp -rpvu ${_tmpdir}/${id} ${_destdir}/${id} | tee -a ${pathdir}/migrate.log
chown -R www-data:www-data ${_destdir}/${id}
fi log_info "update_single_id task done."
} #配置变量函数,sync_dir是同步的源主机子目录,destdir是新发布器目标目录。
function config_and_rsync_all(){
#从源主机的哪个机器同步数据
rsync_from=${1}
#目标同步的目录
if [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
#拉取所有专区文件资源,保留文件时间属性
for i in `seq 0 $(expr ${#domain_m[*]} - 1)`
do
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_m[$i]}
destdir=${youxi_m[$i]}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,如果临时目录已经存在,就直接拷贝文件,如果不存在就创建临时目录在拷贝目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
[ -d ${tmpdir}/${sync_dir} ] && \cp -rpvu ${destdir}/* ${tmpdir}/${sync_dir} || mkdir -p ${tmpdir}/${sync_dir} && \cp -rpvu ${destdir}/* ${tmpdir}/${sync_dir} log_info "Start to get ${sync_dir} all files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/* ${tmpdir}/${sync_dir} | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_all_id ${sync_dir} function ......"
update_all_id ${tmpdir}/${sync_dir} ${destdir}
done
for id in $(ls ${tmpdir}/${domain_m[0]})
do
log_info "建立专区对应的软连接 ..."
ln -nfs /data1/www/abc.test.com/${id} /data1/webapps/${id}.domain.com
chown -R www-data:www-data /data1/webapps/${id}.domain.com
done
elif [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_t}
destdir=${youxi_t}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir}/ log_info "Start to get all files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/* ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_all_id function ......"
update_all_id ${sync_dir} ${destdir}
for id in $(ls ${tmpdir}/${sync_dir})
do
log_info "建立专区对应的软连接 ..."
ln -snf ${destdir}/${id} /data/data1/www/abc.test.com/${id}.domain.com
chown -R www-data:www-data /data/data1/www/abc.test.com/${id}.domain.com
done
elif [[ "${rsync_from}" == "xxx.xxx.xxx.xxx" ]]; then
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_web}
destdir=${youxi_web}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir}/ log_info "Start to get all files ......"
rsync -avuzt game_test@${rsync_from}::game_test/* ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_all_id function ......"
update_all_id ${sync_dir} ${destdir} log_info "Start to backup all nginx configure file......"
\cp -r /data/services/nginx_vhost /data/services/nginx_vhost_bak
log_info "Start to rsync all nginx configure file ......"
rsync -avuzt game_test@${rsync_from}::nginx_test/* /data/services/nginx_vhost/
log_info "update the nginx conf,please to reload nginx service by manual ..."
# service nginx reload
else
log_info "set the sync_dir and destdir value ..."
sync_dir=${domain_pic}
destdir=${youxi_pic}
#备份目录
log_info "backup the destdir ..."
cp -rp ${destdir} ${destdir}_`date "+%Y%m%d%H%M%S"` #将目标目录拷贝到临时目录,为了保证sed处理之后文件时间改变不影响覆盖目标目录,所以将目标目录拷贝到临时目录处理之后再覆盖到目标目录中。
log_info "create tmpdir ..."
\cp -rpvu ${destdir}/* ${tmpdir}/ log_info "Start to get all files ......"
rsync -avuzt game_test@${rsync_from}::game_test/${sync_dir}/* ${tmpdir}/ | tee -a ${pathdir}/migrate.log
log_info "Start to execute update_all_id function ......"
update_all_id ${sync_dir} ${destdir}
fi
} #批量迁移所有专区的函数
function update_all_id(){
_tmpdir=${1}
_destdir=${2}
cd ${_tmpdir}
for id in $(ls ${_tmpdir}/)
do
if [[ ${id} == "ssss" || ${id} == "testsslj" ]]; then
log_info "skip the ${id}."
elif [[ -f ${_tmpdir}/${id} ]]; then
log_info "the ${_tmpdir}/${id} is a file,not dir,please check it and sync by manual."
else
log_info "migrate ${id} start..."
cd ${_tmpdir}/${id}
log_info "replace contexts in the files that in the ${id} directory ..."
#判断目录是否为空
if [ "`ls -A ${_tmpdir}/${id}`" = "" ]; then
log_info "the ${id} is indeed empty."
#判断目录及其子目录是否为空
elif [ "`find ${_tmpdir}/${id}/* -type f`" = "" ]; then
log_info "the ${id} and subdir are empty."
#判断是否有文件需要做内容替换
elif [ "`grep -rEl ${grep_re} ${_tmpdir}/${id}/*`" = "" ]; then
log_info "the ${id} not files need to replace."
#不为空时执行修改文件内容操作
else
log_info "Start to sed ......"
sed -i -e 's/img\.dwstatic\.com/img\.game\.dwstatic\.com/g' \
-e 's/img\(.\)\.dwstatic\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/pic\(.\)\.domain\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/pic01\.domain\.com/img\.game\.dwstatic\.com/g' \
-e 's/pic\(.\)\(.\)\.domain\.com/img\1\.game\.dwstatic\.com/g' \
-e 's/public\.domain\.com/publicgame\.domain\.com/g' \
-e 's/pic\.domain\.\(com\|cn\)/img\.game\.dwstatic\.com/g' $(grep -rEl ${grep_re} ${_tmpdir}/${id}/*)
fi if [ -d ${_destdir}/${id} ]; then
log_info "the ${id} is a exist id,backup old ${id} dirs ..."
[ -d /data/fabuqi_bak/${id}_bak ] && log_info "the ${id}_bak is exist,not need to backup ..." || cp -rfp ${_destdir}/${id} /data/fabuqi_bak/${id}_bak
log_info "replace old ${id} dirs by new ${id} dirs ..."
#同步专区目录到新发布器目标目录中,只会在源文件的更改时间较目标文件更新时或是目标文件并不存在时,才复制文件,保留文件时间属性
\cp -rpvu ${tmpdir}/${1}/${id}/* ${_destdir}/${id}/ | tee -a ${pathdir}/migrate.log
chown -R www-data:www-data ${_destdir}/${id}
else
log_info "the ${id} is a new id,not to backup."
#同步专区目录到新发布器目标目录中
\cp -rpvu ${tmpdir}/${1}/${id} ${_destdir}/${id} | tee -a ${pathdir}/migrate.log
chown -R www-data:www-data ${_destdir}/${id}
fi log_info "migrate ${id} end..."
fi
done
log_info "update_all_id task done."
} #主函数
function main(){
domain_ip=("xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx")
youxi_ip=("xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx" "xxx.xxx.xxx.xxx")
#限制执行脚本的ip,并且制定对应的新管理机从源主机管理机拉取文件,其他类型的机器一样,否则,不执行脚本。
for index in `seq 0 $(expr ${#domain_ip[*]} - 1)`
do
if [ $(ifconfig | grep ${youxi_ip[$index]} | wc -l) -eq 1 ]; then
ip=${domain_ip[$index]}
break
else
ip="error_x"
continue
fi
done if [ $# -ne 1 ]; then
usage
# elif [[ ${1} == "all" ]]; then
# config_and_rsync_all ${2}
elif [[ ${1} == "ssss" || ${1} == "testsslj" ]]; then
log_info "skip the ${1}."
else
if [[ ${ip} == "error_x" ]]; then
log_info "this host $(ifconfig | grep 'inet addr'|awk '{print $2}'| awk -F: '{print $2}'| grep -vE '^$' | head -1) no exist youxi_ip list,please add this ip to youxi_ip on this scripts."
else
config_and_rsync_single ${1} ${ip}
fi
fi
} #执行主函数
main $@

【原创】一个shell脚本记录(实现rsync生产文件批量迁移功能)的更多相关文章

  1. Shell脚本:使用rsync备份文件/目录

    本文我们介绍一个shell脚本,用来使用rsync命令将你本地Linux机器上的文件/目录备份到远程Linux服务器上.使用该脚本会以交互的方式实施备份,你需要提供远程备份服务器的主机名/ip地址和文 ...

  2. 向大家分享一个shell脚本的坑

    打算在跳板机上写一个shell脚本,批量检查远程服务器上的main进程是否在健康运行中. 先找出其中一台远程机器,查看main进程运行情况 [root@two002 tmp]# ps -ef|grep ...

  3. shell脚本中执行另一个shell脚本

    分类: 可以在一个shell脚本中执行另一个shell脚本(或非可执行文件,主要用于取得一些变量的值),方法是: . 文件名(包括路径) 或 变量=文件名(包括路径) . $变量   注意,圆点后面有 ...

  4. 编写第一个 Shell 脚本

    什么是 Shell 脚本? 一个 shell 脚本就是一个包含一系列命令的文件.shell 读取这个文件,然后执行 文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样. 怎样编写一个 Sh ...

  5. Shell教程 之第一个shell脚本

    1.第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行 输入一些代码 #!/bi ...

  6. 编写第一个Shell脚本【TLCL】

    怎样编写一个 Shell 脚本 编写一个脚本 使脚本文件可执行 把脚本放到Shell能够找到的地方 脚本文件格式 #!/bin/bash # This is our first script. ech ...

  7. Linux Shell系列教程之(二)第一个Shell脚本

    本文是Linux Shell系列教程的第(二)篇,更多shell教程请看:Linux Shell系列教程 通过上一篇教程的学习,相信大家已经能够对shell建立起一个大体的印象了,接下来,我们通过一个 ...

  8. Shell脚本调用ftp上传文件

    Shell脚本调用ftp上传文件 1.脚本如下 ftp -n<<! open x.x.x.x ###x.x.x.x为ftp地址 user username password ###user ...

  9. 每秒执行一个shell脚本(转载)

      上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...

随机推荐

  1. HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。

    解决方法: 找到目录浏览,打开,点击右边的启用就OK了.

  2. 使用Newtonsoft.Json输出JSON

    安装: Install-Package Newtonsoft.Json 代码: //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Ad ...

  3. 处理 Windows Phone 应用中的“后退”按钮 (XAML)

    与电脑不同,所有 Windows Phone 设备都有“后退”按钮,它允许用户在应用的页面之间向后导航.如果用户在转到应用的第一页时再次按“后退”按钮,操作系统会挂起你的应用并将用户导航到应用启动前的 ...

  4. 什么是Android NDK

    1.NDK是一系列工具的集合. NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. NDK集成了交叉编译 ...

  5. C++开源库,欢迎补充

    C++在“商业应用”方面,曾经是天下第一的开发语言,但这一桂冠已经被java抢走多年.因为当今商业应用程序类型,已经从桌面应用迅速转移成Web应 用.当Java横行天下之后,MS又突然发力,搞出C#语 ...

  6. Spring Type Conversion(Spring类型转换源码探究)

    1:概述 类型转换系统负责Spring框架中对象类型转换和格式化工作. ConversionService默认实现UML图如下所示: GenericConversionService(通用类型转换服务 ...

  7. java中的String、StringBuffer、StringBuilder的区别

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  8. 3017C语言_文件

    第七章  文件 7.1  C语言文件的概念 7.1.1 文件的概念 在此之前,所有的输入和输出只涉及到键盘和显示器.在运行C程序时,我们通过键盘输入数据并借助显示器把程序的运算结果显示出来.但是,计算 ...

  9. vuex分模块后,如何获取state的值

    问题:vuex分模块后,一个模块如何拿到其他模块的state值,调其他模块的方法? 思路:1.通过命名空间取值--this.$store.state.car.list // OK 2.通过定义该属性的 ...

  10. 妹子问我maven是啥?从相亲说起。。

    自从上一篇原创文章: 第一次教妹子安装IDEA 在<java技术之家>公号发表之后,大家的好评如潮,这给了我继续写下去的信心.感谢你们的支持,我会继续努力的. 自从漂亮妹妹加入我们研发团队 ...