背景:中秋前試着搭建了一下node的環境.簡單的跑了一下.歸來後開始用node寫增刪改查.不過咱們公司本身封裝了不少東西.我也是調用者.可能每一個公司的目錄結構不太同樣,我在這裏講講咱們公司的.node
首先介紹下我理解的目錄結構:mysql
entry---入口端口號
example----業務服務器,處理代碼邏輯,鏈接數據庫等.sql
controllor---邏輯層
dao----數據庫操做層
AppProvider-----加載model層 dao層 和 controller層
model--mysql--User ---- 設計數據庫表字段的
public --config ---常量池
public ---responseE --- 錯誤信息
config---app ----鏈接數據庫數據庫
運行node項目.entry和example兩個文件夾都是須要處於運行狀態.命令行指令: node start
example控制檯是看業務邏輯錯誤的.json
在model層的mysql文件夾下新建User文件
"users"就是表名,我給了字段有name,class,Student_id,age,sex,status,creat_time,update_time.
indexes:這裏是惟一索引.我把Student_id設爲了惟一字段.
allowNull:意思是不能夠爲空.
init()方法,和createTable()方法是封裝好的,我直接調用的.我也不是特別清楚是咱們工時的iot-cloud-core裏面封裝的仍是sequelize裏面封裝的..原諒我第一天用哈..
api
這個文件主要是操做數據庫的.增刪改查的方法都有.
UserDao.js文件內容:服務器
const DaoBase = require('iot-cloud-core').BASE.DaoBase; const Sequelize = require('sequelize'); class UserDao extends DaoBase{ //users表新增數據 async createUsers(data){ this.checkKeyExists(data,'name','class','Student_id','age','sex'); let createData={ name:data.name, class:data.class, Student_id:data.Student_id, age:data.age, sex:data.sex, status:1, }; let res=await this.models.mysql.users.create(createData); return res; } //根據學號獲取users表數據 async findUsersInfoByStudentId(data){ this.checkKeyExists(data,'Student_id'); let selectData={ raw:true, attributes:[ ['class','class'],['sex','sex'],['age','age'], ['name','name'], 'status','create_time','update_time' ], where: { Student_id:data.Student_id, } }; let res = await this.models.mysql.users.find(selectData); console.log(res); return res; } //獲取users表全部數據 async findUsersList(data){ let selectData={ raw:true, attributes:[ ['id','Student_id'],['class','class'],['sex','sex'],['age','age'], ['name','name'],'status','create_time','update_time' ], where:data.where, offset:data.offset, limit:data.limit }; if(!data.where){ selectDara.where = { status:1 }; }else { selectData.where.status = 1; } let res = await this.models.mysql.users.findAll(selectData); return res; } //獲取用戶表數據總量 async countUsersList(data){ let selectData = { where:data.where, }; if(!data.where){ selectData.where = { status:1 }; }else{ selectData.where.status = 1; } let res = await this.models.mysql.users.count(selectData); return res; } //根據主鍵id獲取用戶表數據 async findUsersInfoById(data){ this.checkKeyExists(data,'Student_id'); let selectData ={ raw:true, attributes:[ ['id','Student_id'],['class','class'],['sex','sex'],['age','age'], ['name','name'],'status','create_time','update_time' ], where:{ Student_id:data.Student_id, status:1 } }; let res = await this.models.mysql.users.find(selectData); return res; } //邏輯刪除users表數據 async deleteUsersById(data){ this.checkKeyExists(data,'Student_id'); let deleteData = { status:0 }; let condition={ where:{ Student_id:data.Student_id, status:1 } }; let res = await this.models.mysql.users.update(deleteData,condition); if(res[0] >0){ return true; }else{ return false; } } //更新用戶列表 async updataUsers(data){ this.checkKeyExists(data,'update','where'); let updateData = data.update; let condition={ where:data.where, } let res = await this.models.mysql.users.update(updateData,condition); if(res[0]>0){ return true; }else{ return false; } } } module.exports = UserDao;
這裏的文件名就是接口地址後的方法名.待會詳細介紹下接口地址的組成.
UsersControllor.js文件內容:app
const ControllerBase = require('iot-cloud-core').BASE.ControllerBase; const NoAuth = require('iot-cloud-core').BASE.ControllerDecorator.NoAuth; const responseE = require('../public/responseE'); const config = require('../public/config'); const ServiceManager = require('iot-cloud-fs'); class UsersController extends ControllerBase { /** * addUsers * @description 添加用戶 * @param {string} name 名字 * @param {string} class 班級 * @param {string} Student_id 學號 * @param {int} age 年齡 * @param {string} sex 性別 */ @NoAuth async addUsersAction(data){ //檢查參數 let param=data.params; this.checkKeyExists(param,'name','class','Student_id','age','sex'); //檢查相應的數據是否存在 let findUsersInfoRes = await this.dao.get('users').findUsersInfoByStudentId({ Student_id:param.Student_id, }); if(!findUsersInfoRes){ //數據不存在時,新增數據 let creatData={ name:param.name, class:param.class, Student_id:param.Student_id, age:param.age, sex:param.sex, }; let res =await this.dao.get('users').createUsers(creatData); if(!res){ responseE.error.call(this,'Sql_Error'); } return { success: true } }else if(findUsersInfoRes && findUsersInfoRes.status == 0){ //數據已邏輯刪除,更新數據 let updataData ={ update:{ status:1, name:param.name, class:param.class, sex:param.sex, age:param.age, }, where:{ Student_id:param.Student_id, }, }; let res = await this.dao.get('users').updataUsers(updataData); if(!res){ responseE.error.call(this,'Sql_Error'); } return { success: true } }else if(findUsersInfoRes && findUsersInfoRes.status ==1){ //數據已存在,返回錯誤 responseE.error.call(this,'User_Is_Exist'); } } /** * delUsers * @description 刪除用戶 * @param {int} Student_id 學號 */ @NoAuth async delUsersAction(data){ //檢查參數 let param = data.params; this.checkKeyExists(param,'Student_id'); //檢查學號是否存在 let findUsersInfoRes = await this.dao.get('users').findUsersInfoById({ Student_id:param.Student_id }); if(!findUsersInfoRes){ responseE.error.call(this,'Users_Is_Not_Exist'); } //刪除用戶數據 let res = await this.dao.get('users').deleteUsersById({ Student_id:param.Student_id }); if(!res){ responseE.error.call(this,'Sql_Error'); } return {success :true} } /** * updateUsers * @description 更新用戶 * @param {string} name 名字 * @param {string} class 班級 * @param {string} Student_id 學號 * @param {int} age 年齡 * @param {string} sex 性別 */ @NoAuth async updateUsersAction(data){ //檢查參數 let param = data.params; this.checkKeyExists(param,'Student_id','sex','age','class','name'); //檢查學號是否存在 let findUsersInfoRes = await this.dao.get('users').findUsersInfoById({ Student_id:param.Student_id }); if(!findUsersInfoRes){ responseE.error.call(this,'Users_Is_Not_Exist'); } //更新數據 let updateData = { update:{ name:param.name, sex:param.sex, age:param.age, class:param.class, }, where:{ Student_id:param.Student_id, status:1 } }; let res = await this.dao.get('users').updataUsers(updateData); if(!res){ responseE.error.call(this,'Sql_Error'); } return {success:true}; } /** * getUsersInfo * @description 查詢用戶詳情 * @param {int} Student_id 學號 */ @NoAuth async getUsersInfoAction(data){ //檢查參數 let param =data.params; this.checkKeyExists(param,'Student_id'); let findUsersInfoRes = await this.dao.get('users').findUsersInfoById({ Student_id:param.Student_id }); if(!findUsersInfoRes){ responseE.error.call(this,'Users_Is_Not_Exist'); } return findUsersInfoRes; } /** * getUsersList * @description 獲取用戶列表 * @param {json} where 條件json * */ @NoAuth async getUsersListAction(data){ let param = data.params; this.checkKeyExists(param,'where','page'); //傳入參數轉換爲數據庫查詢字段 let findListData = { where:{} }; if(param.page.hasOwnProperty('currentPage')&& param.page.hasOwnProperty('pageSize')){ findListData.offset = (parseInt(param.page.currentPage) - 1 ) * parseInt(param.page.pageSize); findListData.limit = parseInt(param.page.pageSize); } for(const key in param.where){ let newKey = ''; if(param.where.hasOwnProperty(key) && config.USERS_LIST_WHERE_MAP.hasOwnProperty(key)){ newKey = config.USERS_LIST_WHERE_MAP[key]; findListData.where[newKey]= param.where[key]; } if(param.where.hasOwnProperty(key) && config.USERS_LIST_WHERE_LIKE_MAP.hasOwnProperty(key)){ newKey =config.USERS_LIST_WHERE_LIKE_MAP[key]; findListData.where[newKey] = { $like:`%${param.where[key]}%`}; } } let findListDataRes = await this.dao.get('users').findUsersList(findListData); let countUsersListRes = await this.dao.get('users').countUsersList(findListData); return { list:findListDataRes, total:countUsersListRes } } } module.exports = UsersController;
在public文件夾下分別信息config和responseE文件
config.js文件內容:async
var config ={ USERS_LIST_WHERE_MAP:{ 'StudentId':'id', 'name':'name', 'sex':'sex', 'age':'age', 'class':'class', }, USERS_LIST_WHERE_LIKE_MAP:{ 'name':'name', } } module.exports =config;
responseE.js內容:ide
var errorconfig={ 'Sql_Error':[10001,'sql操做失敗'], 'Users_Is_Exist':[40107,'用戶已存在'], 'Users_Is_Not_Exist':[40108,'用戶不存在'], } class ErrorTemplate{ static error(data){ let mb = errorconfig[data]; this.error(mb[1],mb[0]); } } module.exports = ErrorTemplate;
我把AppProvider.js內容也一併貼出來
AppProvider.js:
const Provider = require('iot-cloud-core').BASE.Provider; const controller_test = require('./controller/TestController'); const controller_users = require('./controller/UsersController'); const dao_test = require('./dao/TestDao'); const dao_users = require('./dao/UserDao'); const db_test = require('./model/mysql/Test'); const db_users = require('./model/mysql/User'); class TestProvider extends Provider{ constructor(dbManager){ super("test",dbManager); this.registerModel(db_test); this.registerModel(db_users); this.registerDao("test",dao_test); this.registerDao("users",dao_users); this.registerController("test",controller_test); this.registerController("users",controller_users); } } module.exports = TestProvider;
注意了這裏都是json數據.因此必定要加{},都是雙引號.最後一條數據不要加逗號,否則會報錯
我就不一一截圖了,這是我一個個方法測試完後最後的表結果.
舉個例子,好比調用添加用戶的方法的接口地址:
http://localhost:3000/openapi/custom/10002/users/addUsers
localhost:本地
3000:entry文件夾運行後獲得的端口號.在entry/config.js裏能夠更改
openapi:固定的
custom:本身的 custom/public custom:項目本身的接口 public:公共接口(用戶,設備等)
10002:appId,在example/app/config/app.js裏能夠更改appId.(若是這裏更改了,那麼entry/start.js裏的appId也要記得更改.)
users:是example/app/model/AppProvider.js裏的 this.registerController("users",controller_users); "users"這裏的這個users
addUsers:是example/app/controller/UsersController.js 裏的 addUsersAction的addUsers.(Action必須加上.)
總結:今天只是簡單的用node鏈接mysql數據庫完成了增刪改查.中間也遇到了不少問題:(1)已經刪除的用戶,只是邏輯刪除,數據庫狀態由1改成了0,沒有真實刪掉.在查詢用戶列表的時候,就要把狀態爲0的數據避開.(2)更改用戶信息,Student_id已經存在,可是狀態爲0.那麼就要把狀態改成1,其餘字段更新爲更新後的信息.(3)粗枝大葉,不少單詞字母寫反了,報錯沒有報的那麼詳細,找錯誤一找找半天.其實只是單詞寫反字母了,或者少打了逗號.要注意呀!!