作者主页:编程千纸鹤

作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师

主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享

项目编号:BS-QD-KS-002

一,项目简介

本项目使用纯前端技术开发实现一个酒店管理系统,前端采用VUE开发实现,后台通过NODEJS作为服务器开发实现,主要实现了酒店管理系统中的:房型管理、房间管理、顾客管理、订单管理等,用户可以注册并登陆后进行相应的管理操作。主要说明

  1. 前后端分离技术
  2. 前端使用vuejs,ElementUI,axios前后端通信,图标使用了ElementUI自带的图标还有font-awesome.css的图标库, 阿里的iconfont图标库也不错,这里没用。
  3. 后端使用了nodejs,nodejs采用了Express框架,orm采用的是Sequelize操作数据库(效率极高),restful风格的Api, 跨域是由后端解决的,采用的是nodejs的cors模块(比较方便)。
  4. 数据库采用了mysql5.2(建议大家换成最新的mysql版本)
  5. 使用jsonwebtoken验证用户调用api的权限,增加接口的安全性,防止恶意攻击接口,串改数据。
  6. 主要界面里面的图片主要使用的是网上的图片,免费而且美观。

二,环境介绍

语言环境:nodejs

数据库: mysql5.7

应用服务器:nodejs

开发工具:IDEA或vscode

开发技术:nodejs+vue+elementUI

三,系统展示

用户注册

用户登陆

房间管理

房型管理

订单管理

订单管理

四,核心代码展示

const { Op } = require('sequelize')//nodejs的sequelize模块
const express = require('express')//express框架
const admin = require('../crud/table/admin.js')//引入管理员信息表
const token = require('../comment/token.js')//引入token模块
const adminRouter = express.Router()//express路由adminRouter.post('/register',(req,res) =>{//管理员注册const { adminId, adminName, adminPassword } = req.body;admin.findOne({where:{adminId:adminId}}).then(data =>{if(data){res.status(200).json({msg:'该用户已经注册',success:false})return new Promise(() =>{})}else{return admin.create({adminId, adminName, adminPassword})}}).then(data =>{res.status(200).json({success:true,msg:'管理员注册成功!',admin:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器错误!'})})})adminRouter.get('/login',(req,res) =>{//登录const { adminId, adminPassword } = req.query;let adminInfo;admin.findOne({where:{adminId}}).then(data =>{if(data){if(data.get().adminPassword==adminPassword){adminInfo = data.get();return token.setToken(data.get())}else{res.status(200).json({success:false,msg:'用户密码错误!'});  return new Promise(() =>{})}}else{res.status(200).json({success:false,msg:'该用户还未注册!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,admin:adminInfo,token:data,msg:'登录成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器出错!'})})
})adminRouter.put('/update',(req,res) =>{//修改管理员信息const { adminId, adminName, adminPassword, adminSex, adminAge } = req.body;admin.findOne({where:{adminId,adminPassword}}).then(data =>{if(data){return admin.update({adminName,adminSex,adminAge},{where:{adminId,adminPassword}})}else{res.status(200).json({success:false,msg:'管理员账号或者密码错误!'})return new Promise(() =>{})}}).then(data =>{return admin.findOne({where:{adminId,adminPassword}})}).then(data =>{res.status(200).json({success:true,msg:'管理员信息修改成功!',admin:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})adminRouter.delete('/del',(req,res) =>{const { adminId } = req.body || req.query;admin.destroy({where:{adminId}}).then(data =>{res.status(200).json({success:true,msg:'删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'删除失败!'})})
})module.exports = adminRouter;
const { Op } = require('sequelize')//nodejs的sequelize模块
const express = require('express')//express框架
const customer = require('../crud/table/customer.js')//引入用户表const customerRouter = express.Router()//express路由customerRouter.post('/add',(req,res) =>{//用户注册const { customerIdCard, customerName, customerSex, customerPhoneNumber } = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该用户已经注册!'})return new Promise(() =>{})}else{return customer.create({customerIdCard, customerName, customerSex, customerPhoneNumber})}}).then(data =>{res.status(200).json({success:true,msg:'用户信息录入成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器错误!'})})
})// customerRouter.get('/login',(req,res) =>{//用户登录
//     const { customerIdCard, cust}
// })customerRouter.put('/update',(req,res) =>{//用户基本信息修改const { customerIdCard, customerName, customerSex, customerPhoneNumber } = req.body;customer.findOne({where:{customerIdCard:{[Op.eq]:customerIdCard}}}).then(data =>{if(data){return customer.update({customerName, customerSex, customerPhoneNumber},{where:{customerIdCard:{[Op.eq]:customerIdCard}}})}else{res.status(200).json({success:false,msg:'该用户还未注册!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'用户信息修改成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
}) customerRouter.delete('/del',(req,res) =>{//删除用户const { customerIdCard } = req.body;customer.destroy({where:{customerIdCard}}).then(data =>{res.status(200).json({success:true,msg:'用户删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})customerRouter.put('/updatevip',(req,res) =>{//购买会员const { customerIdCard, level } = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){return customer.update({level},{where:{customerIdCard}})}else{res.status(200).json({success:false,msg:'该用户未注册!'})return new Promise(() =>{})}}).then(data =>{return customer.findOne({where:{customerIdCard}})}).then(data =>{res.status(200).json({success:true,msg:'vip更改成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})customerRouter.put('/updatemoney',(req,res) =>{//修改用户总消费金额const { customerIdCard, money} = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){let oldMoney = data.get().totalAmount;let newMoney = oldMoney + money;return customer.update({totalAmount: newMoney},{where:{customerIdCard}})}else{res.status(200).json({success:false,msg:'该用户为注册!'})}}).then(data =>{return customer.findOne({where:{customerIdCard}})}).then(data =>{res.status(200).json({success:true,msg:'用户消费金额修改成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})customerRouter.get('/getAllCustomer',(req,res) =>{//查询所有顾客customer.findAndCountAll().then(data =>{res.status(200).json({success:true,msg:'顾客信息查询成功!',customerList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})customerRouter.get('/queryCustomer',(req,res) =>{//模糊查询顾客信息const { queryName } = req.query;customer.findAndCountAll({where:{customerName:{[Op.like]:'%'+queryName+'%'}}}).then(data =>{res.status(200).json({success:true,msg:'顾客信息查询成功!',customerList:data.rows.map(item =>{return item.get()}),count:data.count})}).then(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})module.exports = customerRouter;
const express = require('express')//express框架
const { Op } = require('sequelize')//nodejs的sequelize模块
const order = require('../crud/table/myorder.js')//引入订单信息表
const customer = require('../crud/table/customer.js')//引入顾客信息表
const room = require('../crud/table/room.js')//引入房间信息表order.hasOne(customer,{ sourceKey:'customerIdCard', foreignKey:'customerIdCard' })
order.hasOne(room,{ sourceKey:'roomNumber', foreignKey:'roomNumber' })const orderRouter = express.Router()orderRouter.post('/add',(req,res) =>{//创建订单console.log(req.body)const { orderNumber, orderStatus,customerIdCard,roomNumber,checkInTime,checkOutTime,totalMoney,remarks} = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该订单已经存在!'})return new Promise(() =>{})}else{return customer.findOne({where:{customerIdCard}})}}).then(data =>{if(data){return room.update({roomStatus:'已入住'},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该用户还未注册!'});return new Promise(() =>{});}}).then(data =>{return order.create({orderNumber, orderStatus,customerIdCard,roomNumber,checkInTime,checkOutTime,totalMoney,remarks})}).then(data =>{res.status(200).json({success:'true',msg:'订单创建成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器出错!'})})
})orderRouter.delete('/del',(req,res) =>{//删除订单const { orderNumber } = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){return order.destroy({where:{orderNumber}})}else{res.status(200).json({success:false,msg:'该订单不存在!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.put('/update',(req,res) =>{//修改订单状态const { orderStatus, orderNumber,totalMoney,roomNumber } = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){return room.update({roomStatus:'未入住'},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该订单不存在!'                })return new Promise(() =>{})}}).then(data =>{return order.update({orderStatus,totalMoney},{where:{orderNumber}})}).then(data =>{return order.findOne({where:{orderNumber}})}).then(data =>{res.status(200).json({success:true,msg:'订单修改成功!',order:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})orderRouter.get('/getAllOrder',(req,res) =>{//查询所有订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type','remarks']}]}).then(data =>{res.status(200).json({success:true,msg:'所有订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getAllNotPayOrder',(req,res) =>{//查询所有未支付的订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:'未支付'}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data  =>{res.status(200).json({success:true,msg:'未支付订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getAllPayOrder',(req,res) =>{//查询所有已支付的订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:'已支付'}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data  =>{res.status(200).json({success:true,msg:'未支付订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getStatusOrder',(req,res) =>{//查询所有该状态的订单const { pageSize, offset, orderStatus } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:orderStatus}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data  =>{res.status(200).json({success:true,msg:'状态订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})
module.exports = orderRouter;
const express = require('express')//express框架
const { Op } = require('sequelize')//nodejs的sequelize模块
const room = require('../crud/table/room.js')//引入放假信息表
const roomType = require('../crud/table/roomType.js')//引入所有房间类型表room.hasOne(roomType,{ sourceKey:'type',foreignKey:'type'})//每个房间都有一个房间类型const roomRouter = express.Router()roomRouter.post('/add',(req,res) =>{//添加房间const { roomNumber, type, roomStatus, remarks } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该房间已经存在!'})return new Promise(() =>{})}else{return room.create({roomNumber, type, roomStatus, remarks})}}).then(data =>{return room.findOne({where:{roomNumber},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]})}).then(data =>{res.status(200).json({success:true,msg:'房间添加成功!',room:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.delete('/del',(req,res) =>{const { roomNumber } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){return room.destroy({where:{roomNumber}})}else{res.status(200).json({success:false,msg:'房间删除失败!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'该房间删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.put('/update',(req,res) =>{//修改房间信息const { roomNumber, type, roomStatus,remarks } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){return room.update({type, roomStatus,remarks},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该房间不存在!'})return new Promise(() =>{})}}).then(data =>{return room.findOne({where:{roomNumber}})}).then(data =>{res.status(200).json({success:true,msg:'房间信息修改成功!',room:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误'})})
})roomRouter.get('/getAllRoom',(req,res) =>{//获取所有房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset}).then(data =>{let roomList = data.rows.map(item =>{return item.get()})res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:roomList,count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getOneRoom',(req,res) =>{//获取某个房间号的房间信息const { roomNumber } = req.query;room.findOne({where:{roomNumber}}).then(data =>{if(data){res.status(200).json({success:true,msg:'房间查询成功!',room:data.get()})}else{res.status(200).json({success:false,msg:'未查询到该房间信息'})}}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getNotInRoom',(req,res) =>{//获取未入住房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'未入住'}}}).then(data =>{res.status(200).json({success:true,msg:'未入住房间查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getInRoom',(req,res) =>{//查询已入住房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'已入住'}}}).then(data =>{res.status(200).json({success:true,msg:'已入住房间查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getAllRoomPrice',(req,res) =>{//查询所有的房间以及价格const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getAllNotINRoomPrice',(req,res) =>{//获取所有未入住的房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'未入住'}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})roomRouter.get('/getAllINRoomPrice',(req,res) =>{//获取所有已入住的房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'已入住'}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})roomRouter.get('/getAllRoomTypePrice',(req,res) =>{const { pageSize, offset, type } = req.query;room.findAndCountAll({where:{type:{[Op.eq]:type}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房型查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})roomRouter.get('/getAllStatusRoom',(req,res) =>{//获取所有该状态的房间信息const { pageSize, offset, roomStatus } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:roomStatus}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})module.exports = roomRouter

五,项目总结

基于Nodejs+vue开发实现酒店管理系统相关推荐

  1. 基于springboot+Vue的智慧酒店管理系统

    真正的大师,永远都怀着一颗学徒的心! 一.项目简介 基于springboot+Vue的智慧酒店管理系统 二.实现功能 支持多端 支持用户管理 支持酒店前台管理 支持酒店管理 支持订单管理 支持系统管理 ...

  2. 基于SpringBoot+Vue实现的酒店管理系统

    [简介] 基于springboot+vue实现的酒店管理系统,用于酒店客房业务管理与酒店内部管理. [功能结构] [技术架构] 后端:springboot+mybatis 前端:vue + eleme ...

  3. 基于Nodejs+vue开发实现高校学院网站系统

    作者主页:编程千纸鹤 作者简介:Java.前端.Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发.毕业设计开发.面试技术整理.最新技术分享 项目编号:BS-QD-KS-0 ...

  4. 前端项目:基于Nodejs+vue开发实现高校学院网站系统

    作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...

  5. 基于nodejs+vue的平面设计课程管理系统vscode

    后台由管理员,教师和学生三个角色,其主要功能包括首页,个人中心,学生管理,教师管理,课程类型管理,课程学习管理,试题讲解管理,作业信息管理,作业提交管理,作业批改管理,在线测试管理,试题管理,我的收藏 ...

  6. 基于Sprngboot+Vue的分布式酒店管理系统

    使用技术:dubbo+zookeeper实现分布式 开发技术:springboot+springmvc+mybatis+shiro(权限管理) 开发工具:IDEA.ECLIPSE 数据库:MYSQL ...

  7. 基于nodejs+vue驾校预约网站管理系统

    系统分为用户和管理员,教练三个角色 目 录 第1章 绪论    1 1.1课题背景    1 1.2 背景意义    1 1.3 研究的内容    2 第2章 相关技术    3   第3章 系统分析 ...

  8. nodejs+vue+elementui在线日程管理系统php java python

    基于nodejs+vue+elementui在线日程管理系统的设计基于现有的浏览器,可以实现首页.个人中心.用户管理.日程安排管理.提醒信息管理.用户统计管理.论坛管理.系统管理等功能.方便用户对首页 ...

  9. java计算机毕业设计springboot+vue度假山庄酒店管理系统

    项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中.传统模式的酒店管理满足不了现代人的生活追求,服务质量.服务速度,之前的很多酒店由于人力.物理.财力等原因,一些网站无 ...

  10. java基于SpringBoot+Vue的高校招生管理系统 element 前后端分离

    我们生活的各个领域都涉及到计算机的应用,其中包括招生管理系统的网络应用,在外国招生管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段.招生管理系统具有招生公告信息管理功能的选择.招生管理 ...

最新文章

  1. 堆排序怎么建立初始堆_学习笔记-详解堆排序
  2. [译] Facebook杯2013年编程挑战赛——第一轮题目及答案
  3. 课堂练习——最大联通之数组
  4. Jmeter插件-dubbo
  5. OpenFlow网络中处理正常流量的工作流程
  6. 数组——询问学号(洛谷 P3156)
  7. OpenShift 4 之 GitOps(3)用Helm+ArgoCD部署应用,并保持配置同步
  8. linux 任务计划 cron
  9. 《Ray Tracing in One Weekend》——Chapter 4: Adding a sphere
  10. HDU1166-ZKW树
  11. 关于java多线程堆和栈的共享问题
  12. 【常识】常用RGB颜色对照表
  13. 应用数学软件测试题,数学与应用数学专业试题.doc
  14. 今天来看一下云测平台的测试实验
  15. 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解
  16. Altium Designer 网表导入常见问题 网表导入教程 同步原理图与PCB
  17. js 鼠标拖拽改变div宽度高度
  18. 计算机程序设计员技能试题,计算机程序设计员理论试题库
  19. 工具赋能|Python环境搭建
  20. 【ML】Mean-Shift 原理 + 实践(基于sklearn)

热门文章

  1. vmware workstation 14 密钥
  2. 视频应用在区块链上的应用
  3. stm32f103rbt6基本介绍
  4. 机器学习成长之路——开篇引题
  5. 交叉编译 openwrt 平台上的开源 H3C iNode 客户端 njit-client
  6. java 解析dex_将DEX反编译成Java源代码
  7. 拯救我们的健康:戒烟应用大盘点
  8. uniapp 小程序列表懒加载
  9. 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
  10. abaqus帮助文档html,2534-VUMAT用户子程序翻译ABAQUS帮助手册.doc