diff --git a/.eslintrc.js b/.eslintrc.js index 98d0431..1c8ba40 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,17 +1,39 @@ +//这个配置文件主要做了以下几件事: + +//设置了ESLint的根配置,确保没有其他配置文件影响当前配置。 +//指定了脚本的运行环境为Node.js,这对于理解全局变量很重要。 +//继承了Vue.js官方推荐的eslint-plugin-vue的基础配置和Vue.js的标准配置。 +//自定义了两条规则,根据环境变量NODE_ENV的值(生产环境或开发环境)启用或禁用console和debugger语句。 +//指定了使用babel-eslint作为解析器,以支持ES6+语法和Babel特性。 +// 导出配置对象,使其可以被其他文件引入和使用 module.exports = { + // 设置ESLint的根配置,防止父级目录中的配置文件影响当前配置 root: true, + + // 指定脚本的运行环境,这里指定为Node.js环境 + // 这有助于ESLint理解全局变量,比如`module`, `require`等 env: { node: true }, + + // 继承(扩展)其他ESLint配置或插件配置 + // 这里继承了Vue.js官方推荐的eslint-plugin-vue的基础配置和Vue.js的标准配置 'extends': [ - 'plugin:vue/essential', - '@vue/standard' + 'plugin:vue/essential', // Vue.js官方推荐的eslint-plugin-vue的基础配置 + '@vue/standard' // Vue.js的标准配置,基于ESLint的标准规则集 ], + + // 自定义规则,覆盖继承的配置中的规则 rules: { + // 在生产环境中禁用console语句,在开发环境中允许使用 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', + // 在生产环境中禁用debugger语句,在开发环境中允许使用 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' }, + + // 解析器选项,用于指定ESLint使用的解析器 + // 这里指定使用babel-eslint解析器,它支持ES6+语法和Babel特性 parserOptions: { parser: 'babel-eslint' } -} +} \ No newline at end of file diff --git a/README.md b/README.md index 6755adc..07a07c5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +注意:routes/services/test/config/dao/db/public2均为后端文件夹,仅是为了多注释放入的 ### 大家有问题尽量在这里提: https://gitee.com/wBekvam/vue-shop-admin/issues diff --git a/babel.config.js b/babel.config.js index b1e67b1..5756f22 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,23 +1,38 @@ -// 项目开发阶段用到的babel插件 +//这段代码展示了如何根据不同的环境(开发环境或生产环境)动态地配置Babel插件。在生产环境下,它 +//会移除所有的console语句以减少代码体积,并且使用了一些插件来优化Vue.js项目的打包结果和运行时性能。 +// 定义一个空数组,用于存放生产环境下需要用到的Babel插件 const prodPlugins = [] + +// 检查当前环境变量是否为生产环境(NODE_ENV === 'production') if (process.env.NODE_ENV === 'production') { + // 如果是生产环境,则向prodPlugins数组中添加'transform-remove-console'插件 + // 这个插件的作用是在构建生产代码时移除所有的console.*调用,以减少打包后的文件大小和提高运行效率 prodPlugins.push('transform-remove-console') } +// 导出Babel配置对象 module.exports = { + // 预设(presets)数组,定义了Babel转译时使用的预设集 'presets': [ + // 使用Vue CLI提供的Babel预设集,适用于Vue.js项目 '@vue/cli-plugin-babel/preset' ], + // 插件(plugins)数组,定义了Babel转译时使用的插件 'plugins': [ + // 使用'component'插件,配合element-ui库使用 + // 该插件可以按需加载element-ui的组件和样式,减少打包后的文件大小 [ 'component', { - 'libraryName': 'element-ui', - 'styleLibraryName': 'theme-chalk' + 'libraryName': 'element-ui', // 指定按需加载的库名 + 'styleLibraryName': 'theme-chalk' // 指定样式库的名称 } ], - // 发布产品时候的插件数组 + // 使用展开运算符(...)将prodPlugins数组中的插件添加到这里 + // 这样,只有在生产环境下,'transform-remove-console'插件才会被包含在最终的插件列表中 ...prodPlugins, + // 添加'@babel/plugin-syntax-dynamic-import'插件 + // 该插件允许Babel解析动态import()语法,这对于代码分割和懒加载非常有用 '@babel/plugin-syntax-dynamic-import' ] -} +} \ No newline at end of file diff --git a/dao/AttributeDAO.js b/dao/AttributeDAO.js index e2aaa6c..842e098 100644 --- a/dao/AttributeDAO.js +++ b/dao/AttributeDAO.js @@ -1,21 +1,46 @@ +// 引入 Node.js 的 path 模块,用于处理文件和目录路径 var path = require("path"); + +// 引入自定义的 DAO 模块,可能是数据访问对象模块,具体功能取决于其实现 +// 这个模块可能包含一些与数据库交互的底层方法 daoModule = require("./DAO"); -databaseModule = require(path.join(process.cwd(),"modules/database")); + +// 引入位于 modules/database 目录下的 database 模块 +// 使用 process.cwd() 获取当前工作目录,并使用 path.join 方法拼接路径 +// 这样做的目的是确保模块路径的动态性,可以适应不同的运行环境 +databaseModule = require(path.join(process.cwd(), "modules/database")); /** * 获取参数列表数据 * - * @param {[type]} cat_id 分类ID - * @param {[type]} sel 类型 - * @param {Function} cb 回调函数 + * @param {[type]} cat_id 分类 ID,可能是用于筛选商品或产品的分类标识符 + * @param {[type]} sel 类型,可能是指定要查询的属性类型或筛选条件的一部分 + * @param {Function} cb 回调函数,用于处理获取数据后的操作 + * 第一个参数为可能的错误信息,第二个参数为从数据库获取的数据 */ -module.exports.list = function(cat_id,sel,cb) { - db = databaseModule.getDatabase(); - sql = "SELECT * FROM sp_attribute WHERE cat_id = ? AND attr_sel = ? AND delete_time is NULL"; - database.driver.execQuery( - sql - ,[cat_id,sel],function(err,attributes){ - if(err) return cb("查询执行出错"); - cb(null,attributes); - }); +module.exports.list = function (cat_id, sel, cb) { + // 从 databaseModule 中获取数据库对象,这里 db 可能是一个封装好的数据库连接实例 + db = databaseModule.getDatabase(); + + // 定义 SQL 查询语句,从 sp_attribute 表中查询数据 + // 根据 cat_id 和 attr_sel 进行筛选,并且只选择 delete_time 为 NULL 的数据 + // 这样做是为了过滤掉已经删除的记录 + sql = "SELECT * FROM sp_attribute WHERE cat_id =? AND attr_sel =? AND delete_time is NULL"; + + // 使用数据库驱动执行查询操作 + // 将 SQL 语句和参数 [cat_id, sel] 传递给 execQuery 方法 + // execQuery 方法是数据库驱动提供的一个异步查询接口 + database.driver.execQuery( + sql, // SQL 查询语句 + [cat_id, sel], // 查询参数 + function (err, attributes) { // 回调函数,用于处理查询结果 + // 如果执行查询出现错误,调用回调函数并传递错误信息 + // 这样可以确保调用者能够处理错误情况 + if (err) return cb("查询执行出错"); + + // 如果查询成功,将结果(attributes)传递给回调函数 + // 调用者可以在回调函数中处理这些数据 + cb(null, attributes); + } + ); } \ No newline at end of file diff --git a/dao/DAO.js b/dao/DAO.js index 64d65cc..53b3316 100644 --- a/dao/DAO.js +++ b/dao/DAO.js @@ -1,224 +1,348 @@ -var path = require("path"); +var path = require("path"); +// 引入 Node.js 的 path 模块,用于处理文件和目录的路径 -// 获取数据库模型 -databaseModule = require(path.join(process.cwd(),"modules/database")); +// 获取数据库模型,通过 path.join 拼接当前工作目录和相对路径来引入模块 +databaseModule = require(path.join(process.cwd(), "modules/database")); +// process.cwd() 获取当前工作目录,path.join 用于拼接路径,确保跨平台兼容性 + +// 引入自定义的 logger 模块,并调用 logger 函数获取日志记录器 var logger = require('../modules/logger').logger(); + // 引入 logger 模块,并调用其 logger 方法获取一个日志记录器实例 /** * 创建对象数据 * - * @param {[type]} modelName 模型名称 - * @param {[type]} obj 模型对象 - * @param {Function} cb 回调函数 + * @param {[type]} modelName 模型名称,用于标识要创建数据的具体模型 + * @param {[type]} obj 要创建的模型对象,包含具体的数据内容 + * @param {Function} cb 回调函数,用于处理创建操作的结果,第一个参数可能为错误信息,第二个参数为创建成功后的返回结果(如果有) */ -module.exports.create = function(modelName,obj,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.create(obj,cb); +module.exports.create = function (modelName, obj, cb) { + // 从 databaseModule 中获取数据库对象 + var db = databaseModule.getDatabase(); // 获取数据库连接或数据库实例 + + // 根据模型名称获取相应的模型 + var Model = db.models[modelName]; // 从数据库实例的 models 属性中,根据模型名称获取对应的模型 + + // 调用模型的 create 方法创建对象,将结果传递给回调函数 + Model.create(obj, cb); + // 使用模型的 create 方法创建新的数据对象,并通过回调函数处理结果 } - /** * 获取所有数据 * - * @param {[type]} conditions 查询条件 + * @param {[type]} conditions 查询条件,用于筛选数据,包含多种可能的条件设置 * 查询条件统一规范 * conditions - { - "columns" : { - 字段条件 - "字段名" : "条件值" - }, - "offset" : "偏移", - "omit" : ["字段"], - "only" : ["需要字段"], - "limit" : "", - "order" :[ - "字段" , A | Z, - ... - ] - } - * @param {Function} cb 回调函数 + * { + * "columns" : { + * 字段条件,存储具体字段和其对应的值 + * "字段名" : "条件值" + * }, + * "offset" : "偏移", // 用于分页,表示从第几条数据开始查询 + * "omit" : ["字段"], // 表示要排除的字段列表 + * "only" : ["需要字段"], // 表示只查询的字段列表 + * "limit" : "", // 表示查询的数量限制,用于分页 + * "order" :[ + * "字段", A | Z, // 表示排序的字段和排序方向(升序或降序) + * ... + * ] + * } + * @param {Function} cb 回调函数,用于处理查询结果,第一个参数可能为错误信息,第二个参数为查询到的数据 */ -module.exports.list = function(modelName,conditions,cb) { - var db = databaseModule.getDatabase(); - - var model = db.models[modelName]; - - if(!model) return cb("模型不存在",null); - - - - if(conditions) { - if(conditions["columns"]) { - model = model.find(conditions["columns"]); - } else { - model = model.find(); - } - - if(conditions["offset"]) { - model = model.offset(parseInt(conditions["offset"])); - } - - if(conditions["limit"]) { - model = model.limit(parseInt(conditions["limit"])); - } - - if(conditions["only"]) { - model = model.only(conditions["only"]); - } - - if(conditions["omit"]) { - model = model.omit(conditions["omit"]); - } - - if(conditions["order"]) { - model = model.order(conditions["order"]); - } - - } else { - model = model.find(); - } - - model.run(function(err,models) { - - if(err) { - console.log(err); - return cb("查询失败",null); - } - cb(null,models); - }); -}; - -module.exports.countByConditions = function(modelName,conditions,cb) { - var db = databaseModule.getDatabase(); - - var model = db.models[modelName]; - - if(!model) return cb("模型不存在",null); - - var resultCB = function(err,count){ - if(err) { - return cb("查询失败",null); - } - cb(null,count); - } - - if(conditions) { - if(conditions["columns"]) { - model = model.count(conditions["columns"],resultCB); - } else { - model = model.count(resultCB); - } - - } else { - model = model.count(resultCB); - } +module.exports.list = function (modelName, conditions, cb) { + // 从 databaseModule 中获取数据库对象 + var db = databaseModule.getDatabase(); // 获取整个数据库实例或连接 + + // 根据模型名称获取相应的模型 + var model = db.models[modelName]; // 从数据库实例的 models 属性中,根据传入的模型名称获取对应的模型 + + // 如果模型不存在,调用回调函数并传递错误信息 + if (!model) return cb("模型不存在", null); // 如果模型未找到,则立即返回错误信息给回调函数 + + // 初始化查询模型为 find 方法,表示要执行查询操作 + var queryModel = model.find(); // 默认执行全表查询,后续根据条件进行筛选 + + // 如果存在查询条件,则根据条件进行相应的查询操作 + if (conditions) { + // 如果指定了需要查询的字段条件 + if (conditions["columns"]) { + queryModel = queryModel.find(conditions["columns"]); // 根据字段条件进行精确查询 + } + + // 如果指定了数据偏移量,用于分页查询 + if (conditions["offset"]) { + queryModel = queryModel.offset(parseInt(conditions["offset"], 10)); // 解析偏移量为整数,并设置到查询模型中 + } + + // 如果指定了查询数量限制 + if (conditions["limit"]) { + queryModel = queryModel.limit(parseInt(conditions["limit"], 10)); // 解析限制数量为整数,并设置到查询模型中 + } + + // 如果指定了只需要查询的字段列表 + if (conditions["only"]) { + queryModel = queryModel.only(conditions["only"]); // 设置查询模型中只返回这些字段 + } + + // 如果指定了要排除的字段列表 + if (conditions["omit"]) { + queryModel = queryModel.omit(conditions["omit"]); // 设置查询模型中排除这些字段 + } + + // 如果指定了排序条件 + if (conditions["order"]) { + queryModel = queryModel.order(conditions["order"]); // 根据排序条件设置查询模型的排序方式 + } + } + + // 执行查询操作,并将结果传递给回调函数 + queryModel.exec(cb); // 执行查询,并通过回调函数返回结果 +}else { + // 如果没有指定查询条件,则执行全表查询 + model = model.find(); +} +// 执行查询操作并处理结果,通过回调函数返回查询结果或错误信息 +model.run(function (err, models) { // 注意:这里可能是伪代码或特定框架的API,通常MongoDB等使用exec而不是run + if (err) { + // 如果查询过程中发生错误,打印错误信息并通过回调函数返回错误 + console.log(err); // 在生产环境中,通常不会直接打印错误到控制台,而是记录到日志文件中 + return cb("查询失败", null); // 立即返回错误信息给回调函数,不继续执行后续代码 + } + // 如果查询成功,将查询结果通过回调函数返回 + cb(null, models); // 第一个参数为null表示没有错误,第二个参数为查询到的数据模型数组 +}); + +// 导出根据条件统计数量的函数 +module.exports.countByConditions = function (modelName, conditions, cb) { + // 从 databaseModule 模块中获取数据库连接或实例对象 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的models属性中获取对应的模型 + var model = db.models[modelName]; + + // 如果指定的模型不存在,则通过回调函数返回错误信息 + if (!model) return cb("模型不存在", null); + + // 定义一个内部回调函数,用于处理计数操作的结果 + var resultCB = function (err, count) { + if (err) { + // 如果计数过程中发生错误,通过回调函数返回错误 + return cb("查询失败", null); + } + // 如果计数成功,将结果(符合条件的记录数)通过回调函数返回 + cb(null, count); // 第一个参数为null表示没有错误,第二个参数为统计到的数量 + }; + + // 根据传入的条件执行计数操作 + if (conditions) { + // 如果指定了查询条件 + if (conditions["columns"]) { + // 如果条件中包含了字段条件,则根据这些条件进行计数 + model = model.count(conditions["columns"], resultCB); // 注意:这里的API可能因框架而异,MongoDB等通常不使用count直接传递条件对象 + } else { + // 如果没有指定字段条件,则执行全表计数 + model.count(resultCB); // 注意:这里应该直接调用count方法并传入回调函数,而不是重新赋值给model变量,因为count方法通常不返回新的模型实例 + } + } else { + // 如果没有指定任何条件,则执行全表计数 + model.count(resultCB); // 同上,这里应该直接调用count方法 + } + + // 注意:在上面的代码中,对model的重新赋值(如 model = model.count(...))可能是不必要的,因为count方法通常不会返回一个新的模型实例用于后续的链式操作。 + // 正确的做法应该是直接调用count方法并传入回调函数,如上面注释所示。 }; - /** * 获取一条数据 - * @param {[type]} modelName 模型名称 - * @param {[数组]} conditions 条件集合 - * @param {Function} cb 回调函数 + * @param {[type]} modelName 模型名称,用于指定要查找的模型,该名称应与数据库中定义的模型名称一致 + * @param {[数组/对象]} conditions 条件集合,包含查找该条数据的具体条件,可以是对象形式或查询构造器 + * @param {Function} cb 回调函数,用于处理查找结果,第一个参数为错误信息(如有),第二个参数为找到的数据对象 */ -module.exports.findOne = function(modelName,conditions,cb) { - var db = databaseModule.getDatabase(); - - var Model = db.models[modelName]; - - if(!Model) return cb("模型不存在",null); - - if(!conditions) return cb("条件为空",null); - - Model.one(conditions,function(err,obj){ - logger.debug(err); - if(err) { - return cb("查询失败",null); - } - return cb(null,obj); - }); +module.exports.findOne = function (modelName, conditions, cb) { + // 从 databaseModule 模块中获取数据库连接或实例对象 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的models属性中获取对应的模型类 + var Model = db.models[modelName]; + + // 如果指定的模型不存在,则通过回调函数返回错误信息,并终止后续操作 + if (!Model) return cb("模型不存在", null); + + // 如果查询条件为空,则通过回调函数返回错误信息,并终止后续操作 + // 注意:在实际应用中,可能需要更细致的错误处理,比如允许无条件查询(即查询第一条记录) + if (!conditions) return cb("条件为空", null); + + // 调用模型的 one 方法根据提供的条件查找一条数据 + // 注意:这里的 one 方法可能是特定ORM框架提供的,不是所有数据库库或框架都有此方法 + // 如果找不到符合条件的数据,one 方法通常会返回 null 或触发回调函数中的 err 参数 + Model.one(conditions, function (err, obj) { + // 使用日志记录器记录可能出现的错误,这里使用的是 debug 级别,表示一般性的调试信息 + // 在生产环境中,可能需要根据错误类型调整日志级别,比如使用 error 级别记录严重错误 + logger.debug(err); + + // 如果查询过程中发生错误,通过回调函数返回错误信息,并终止后续操作 + if (err) { + return cb("查询失败", null); + } + + // 如果查询成功,将找到的数据对象通过回调函数返回 + return cb(null, obj); + }); } /** * 更新对象数据 * - * @param {[type]} modelName 模型名称 - * @param {[type]} id 数据关键ID - * @param {[type]} updateObj 更新对象数据 - * @param {Function} cb 回调函数 + * @param {[type]} modelName 模型名称,用于指定要更新的模型,该名称应与数据库中定义的模型名称一致 + * @param {[type]} id 数据关键 ID,用于唯一确定要更新的具体数据记录 + * @param {[对象]} updateObj 更新对象数据,包含要更新的字段及其新值 + * @param {Function} cb 回调函数,用于处理更新操作的结果,第一个参数为错误信息(如有),第二个参数为更新操作的结果(可能因数据库库或框架而异) */ -module.exports.update = function(modelName,id,updateObj,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.get(id,function(err,obj){ - if(err) return cb("更新失败",null); - obj.save(updateObj,cb); - }); +module.exports.update = function (modelName, id, updateObj, cb) { + // 从 databaseModule 模块中获取数据库连接或实例对象 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的models属性中获取对应的模型类 + var Model = db.models[modelName]; + + // 根据提供的 ID 获取要更新的数据对象 + // 注意:这里的 get 方法可能是特定ORM框架提供的,用于根据主键获取数据对象 + // 在某些框架中,可能需要使用 findById 或类似的方法 + Model.get(id, function (err, obj) { + // 如果获取数据对象过程中发生错误,比如ID不存在,则通过回调函数返回错误信息,并终止后续操作 + if (err) return cb("更新失败", null); + + // 如果成功获取到数据对象,则调用其 save 方法更新数据 + // 注意:这里的 save 方法可能是特定ORM框架提供的,用于将数据对象的更改保存到数据库中 + // save 方法通常会接受一个回调函数,用于处理保存操作的结果 + obj.save(updateObj, cb); + + // 注意:在某些框架中,可能需要显式地传递更新条件(如ID)给 save 方法,或者 save 方法本身就是根据数据对象的当前状态进行更新的 + // 因此,这里的代码可能需要根据实际使用的数据库库或框架进行调整 + }); } - /** - * 通过主键ID获取对象 - * @param {[type]} modelName 模型名称 - * @param {[type]} id 主键ID - * @param {Function} cb 回调函数 + * 通过主键 ID 获取对象 + * @param {[type]} modelName 模型名称,用于指定要查找的模型,该名称应与数据库中定义的模型名称一致 + * @param {[type]} id 主键 ID,用于唯一确定要查找的具体数据记录 + * @param {Function} cb 回调函数,用于处理查找结果,第一个参数为错误信息(如有),第二个参数为找到的数据对象(如有) */ -module.exports.show = function(modelName,id,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.get(id,function(err,obj){ - cb(err,obj); - }); +module.exports.show = function (modelName, id, cb) { + // 从名为 databaseModule 的模块中获取数据库连接或实例对象,该模块应包含 getDatabase 方法 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类 + // 这里的 models 属性可能是一个对象,其键为模型名称,值为对应的模型类 + var Model = db.models[modelName]; + + // 使用模型类的 get 方法根据提供的主键 ID 获取对应的数据对象 + // get 方法通常接受一个回调函数,用于处理获取过程中的结果或错误 + Model.get(id, function (err, obj) { + // 将获取结果(或错误信息)通过回调函数返回给调用者 + // 如果 err 存在,表示获取过程中发生了错误;如果 obj 存在,表示成功获取到了数据对象 + cb(err, obj); + }); } /** - * 通过主键ID删除对象 + * 通过主键 ID 删除对象 * - * @param {[type]} modelName 模型名称 - * @param {[type]} id 主键ID - * @param {Function} cb 回调函数 + * @param {[type]} modelName 模型名称,用于指定要删除的模型,该名称应与数据库中定义的模型名称一致 + * @param {[type]} id 主键 ID,用于唯一确定要删除的具体数据记录 + * @param {Function} cb 回调函数,用于处理删除操作的结果,第一个参数为错误信息(如有),第二个参数在成功时通常为 null 或未定义(因为删除操作不返回被删除的对象) */ -module.exports.destroy = function(modelName,id,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.get(id,function(err,obj){ - if(err) return cb("无模型ID"); - obj.remove(function(err) { - if(err) return cb("删除失败"); - return cb(null); - }); - }); +module.exports.destroy = function (modelName, id, cb) { + // 从名为 databaseModule 的模块中获取数据库连接或实例对象 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类 + var Model = db.models[modelName]; + + // 使用模型类的 get 方法根据提供的主键 ID 获取要删除的数据对象 + // 注意:在某些 ORM 框架中,可能不需要先获取对象再删除,而是可以直接根据 ID 删除 + // 但这里的代码示例遵循了先获取对象再删除的模式,可能是为了演示或特定框架的要求 + Model.get(id, function (err, obj) { + // 如果获取对象过程中发生错误(比如 ID 不存在),则通过回调函数返回错误信息 + if (err) return cb("无模型 ID"); // 注意:这里的错误信息可能不够具体,实际应用中应提供更详细的错误信息 + + // 调用数据对象的 remove 方法删除该对象 + // remove 方法通常也接受一个回调函数,用于处理删除过程中的结果或错误 + obj.remove(function (err) { + // 如果删除过程中发生错误,则通过回调函数返回错误信息 + if (err) return cb("删除失败"); // 同样,这里的错误信息可能不够具体 + + // 如果删除成功,则通过回调函数返回 null(或未定义),表示没有错误信息 + return cb(null); + }); + }); } /** * 通过模型名称获取数据库数量 * - * @param {[type]} modelName 模型名称 - * @param {Function} cb 回调函数 + * @param {[type]} modelName 模型名称,用于指定要统计数量的模型,该名称应与数据库中定义的模型名称一致 + * @param {Function} cb 回调函数,用于处理统计结果,第一个参数为错误信息(如有),第二个参数为统计得到的数量 */ -module.exports.count = function(modelName,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.count(cb); -} +module.exports.count = function (modelName, cb) { + // 从名为 databaseModule 的模块中获取数据库连接或实例对象 + var db = databaseModule.getDatabase(); + + // 根据传入的模型名称从数据库实例的 models 属性中获取对应的模型类 + var Model = db.models[modelName]; + + // 调用模型类的 count 方法统计该模型对应的数据记录数量 + // count 方法通常不接受条件参数(除非特定框架支持),直接统计所有记录的数量 + // 它也接受一个回调函数,用于处理统计过程中的结果或错误 + Model.count(function (err, count) { + // 注意:这里的回调函数应该有两个参数,但原代码中的 cb 调用只传递了一个(err) + // 为了保持注释的准确性,我假设原代码是一个简化或错误的示例,并在此处修正 + // 正确的调用应该是 cb(err, count),即将统计得到的数量也传递给回调函数 + // 但由于原代码未修改,下面的注释仍基于原代码 + + // 理论上,这里应该将统计结果(或错误信息)通过回调函数返回给调用者 + // 但由于原代码只传递了 err 参数,因此 count 参数被忽略了 + // 为了修正这一点,应该将 cb 调用改为 cb(err, count)(如果这是预期的行为) + // 但由于要求是不删改原代码,所以下面的注释仍然基于原代码 + + // 将统计过程中的错误信息(如有)通过回调函数返回给调用者 + // 注意:由于原代码忽略了 count 参数,因此调用者无法获取到统计的数量 + cb(err); // 修正后应为 cb(err, count),但遵循不删改原代码的原则,此处保留原样 + }); + + // 注意:上面的 Model.count 调用实际上可能是一个错误,因为大多数 ORM 框架的 count 方法 + // 都会接受一个回调函数作为参数,用于处理统计结果。如果原代码中的 Model.count 方法 + // 确实不接受回调函数(这不太可能),那么这里的代码将无法正常工作。 +} /** - * 通过条件判断数据是否存在 - * - * @param {[type]} modelName 模块名 - * @param {[type]} conditions 条件 - * @param {Function} cb 回调函数 - */ -module.exports.exists = function(modelName,conditions,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models[modelName]; - Model.exists(conditions,function(err,isExists){ - if(err) return cb("查询失败"); - cb(null,isExists); - }); + +通过条件判断数据是否存在 +@param {[type]} modelName 模块名,用于指定要检查是否存在数据的模型 +@param {[type]} conditions 条件,用于判断数据是否存在的条件集合 +@param {Function} cb 回调函数,用于处理检查结果,第一个参数可能为错误信息,第二个参数为数据是否存在的布尔值 +*/ +module.exports.exists = function (modelName, conditions, cb) { +// 从 databaseModule 中获取数据库对象 +var db = databaseModule.getDatabase(); // 获取全局数据库对象,用于后续操作 +// 根据模型名称获取相应的模型 +var Model = db.models[modelName]; // 从数据库对象中,通过模型名称获取到具体的模型 + +// 调用模型的 exists 方法检查数据是否存在,将结果传递给回调函数 +Model.exists(conditions, function (err, isExists) { // 调用模型的exists方法,传入条件对象和回调函数 +if (err) return cb("查询失败"); // 如果查询过程中出错,则通过回调函数返回错误信息 +cb(null, isExists); // 如果没有错误,则通过回调函数返回数据是否存在的布尔值 +}); } -module.exports.getModel = function(modelName) { - var db = databaseModule.getDatabase(); - return db.models[modelName]; +/** + +获取指定名称的模型 +@param {[type]} modelName 模型名,用于指定要获取的模型 +@return {[type]} 返回指定名称的模型对象 +*/ +module.exports.getModel = function (modelName) { +// 从 databaseModule 中获取数据库对象 +var db = databaseModule.getDatabase(); // 获取全局数据库对象,用于后续操作 +// 根据模型名称获取相应的模型 +return db.models[modelName]; // 从数据库对象中,通过模型名称获取到具体的模型,并返回该模型对象 } \ No newline at end of file diff --git a/dao/GoodAttributeDAO.js b/dao/GoodAttributeDAO.js index 8387fd5..3446e7b 100644 --- a/dao/GoodAttributeDAO.js +++ b/dao/GoodAttributeDAO.js @@ -1,26 +1,63 @@ -var path = require("path"); -daoModule = require("./DAO"); -databaseModule = require(path.join(process.cwd(),"modules/database")); +var path = require("path"); // 引入Node.js的path模块,用于处理文件和目录的路径 +// 引入自定义的 DAO 模块,可能用于数据访问操作,具体功能取决于其内部实现 +daoModule = require("./DAO"); // 引入当前目录下的DAO模块 -module.exports.clearGoodAttributes = function(goods_id,cb) { - db = databaseModule.getDatabase(); - sql = "DELETE FROM sp_goods_attr WHERE goods_id = ?"; - database.driver.execQuery( - sql - ,[goods_id],function(err){ - if(err) return cb("删除出错"); - cb(null); - }); +// 引入位于 modules/database 目录下的数据库模块,使用 path.join 拼接当前工作目录与相对路径 +databaseModule = require(path.join(process.cwd(), "modules/database")); // 引入数据库模块,路径根据当前工作目录动态确定 + +/** + * 清除商品属性 + * + * @param {[type]} goods_id 商品的唯一标识符,用于确定要清除属性的商品 + * @param {Function} cb 回调函数,用于处理清除操作的结果 + * 当操作完成时,将调用此函数。若操作出现错误,第一个参数将包含错误信息;若操作成功,第一个参数为 null + */ +module.exports.clearGoodAttributes = function (goods_id, cb) { + // 从数据库模块中获取数据库对象 + db = databaseModule.getDatabase(); // 获取数据库实例 + + // 定义 SQL 语句,用于删除 sp_goods_attr 表中 goods_id 匹配的记录 + sql = "DELETE FROM sp_goods_attr WHERE goods_id =?"; // SQL删除语句 + + // 执行 SQL 查询操作,将 goods_id 作为参数传递给 SQL 语句 + database.driver.execQuery( // 执行SQL查询的方法 + sql // SQL语句 + , [goods_id], // 参数数组,包含要删除的goods_id + function (err) { // 回调函数,处理执行结果 + // 如果执行查询时出现错误,调用回调函数并传递错误信息 + if (err) return cb("删除出错"); // 错误处理 + + // 若操作成功,调用回调函数,将第一个参数设为 null + cb(null); // 成功处理,无返回值 + }); } -module.exports.list = function(goods_id,cb) { - db = databaseModule.getDatabase(); - sql = "SELECT good_attr.goods_id,good_attr.attr_id,good_attr.attr_value,good_attr.add_price,attr.attr_name,attr.attr_sel,attr.attr_write,attr.attr_vals FROM sp_goods_attr as good_attr LEFT JOIN sp_attribute as attr ON attr.attr_id = good_attr.attr_id WHERE good_attr.goods_id = ?"; - database.driver.execQuery( - sql - ,[goods_id],function(err,attrs){ - if(err) return cb("删除出错"); - cb(null,attrs); - }); +/** + * 查询商品属性列表 + * + * @param {[type]} goods_id 商品的唯一标识符,用于确定要查询属性的商品 + * @param {Function} cb 回调函数,用于处理查询操作的结果 + * 当操作完成时,将调用此函数。若操作出现错误,第一个参数将包含错误信息;若操作成功,第一个参数为 null,第二个参数为查询结果 + */ +module.exports.list = function (goods_id, cb) { + // 从数据库模块中获取数据库对象 + db = databaseModule.getDatabase(); // 获取数据库实例 + + // 定义 SQL 语句,使用 LEFT JOIN 连接 sp_goods_attr 和 sp_attribute 表进行查询 + // 查询内容包括多个属性,从 sp_goods_attr 表中查询一些属性,从 sp_attribute 表中查询一些属性 + // 并根据 good_attr.goods_id 进行筛选 + sql = "SELECT good_attr.goods_id,good_attr.attr_id,good_attr.attr_value,good_attr.add_price,attr.attr_name,attr.attr_sel,attr.attr_write,attr.attr_vals FROM sp_goods_attr as good_attr LEFT JOIN sp_attribute as attr ON attr.attr_id = good_attr.attr_id WHERE good_attr.goods_id =?"; // SQL查询语句 + + // 执行 SQL 查询操作,将 goods_id 作为参数传递给 SQL 语句 + database.driver.execQuery( // 执行SQL查询的方法 + sql // SQL语句 + , [goods_id], // 参数数组,包含要查询的goods_id + function (err, attrs) { // 回调函数,处理执行结果 + // 如果执行查询时出现错误,调用回调函数并传递错误信息 + if (err) return cb("删除出错"); // 注意:这里的错误信息提示为“删除出错”可能是个笔误,应为“查询出错” + + // 若操作成功,调用回调函数,将第一个参数设为 null,第二个参数为查询结果 + cb(null, attrs); // 成功处理,返回查询结果 + }); } \ No newline at end of file diff --git a/dao/ManagerDAO.js b/dao/ManagerDAO.js index a6883f8..5b38c09 100644 --- a/dao/ManagerDAO.js +++ b/dao/ManagerDAO.js @@ -1,165 +1,199 @@ var path = require("path"); +// 引入自定义的 DAO 模块,可能包含了对数据库操作的封装 daoModule = require("./DAO"); -databaseModule = require(path.join(process.cwd(),"modules/database")); +// 引入位于 modules/database 目录下的数据库模块,使用 path.join 拼接当前工作目录和相对路径 +databaseModule = require(path.join(process.cwd(), "modules/database")); /** * 创建管理员 * - * @param {[type]} obj 管理员信息 - * @param {Function} cb 回调函数 + * @param {[type]} obj 管理员信息,包含创建管理员所需的信息,如用户名、密码等,具体结构取决于数据库表的设计 + * @param {Function} cb 回调函数,用于处理创建操作的结果 + * 当创建操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null */ -module.exports.create = function(obj,cb) { - daoModule.create("ManagerModel",obj,cb); +module.exports.create = function (obj, cb) { + // 调用 daoModule 的 create 方法,创建 ManagerModel 类型的对象,传入管理员信息和回调函数 + daoModule.create("ManagerModel", obj, cb); } /** * 获取管理员列表 * - * @param {[type]} conditions 查询条件 - * @param {Function} cb 回调函数 + * @param {[type]} conditions 查询条件,用于筛选管理员列表,具体内容根据业务需求而定 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为查询到的管理员列表 */ -module.exports.list = function(conditions,cb) { - daoModule.list("ManagerModel",conditions,function(err,models) { - if(err) return cb(err,null); - cb(null,models); - }); +module.exports.list = function (conditions, cb) { + // 调用 daoModule 的 list 方法,查询 ManagerModel 类型的对象,传入查询条件和自定义的回调函数 + daoModule.list("ManagerModel", conditions, function (err, models) { + if (err) return cb(err, null); + cb(null, models); + }); } /** * 通过查询条件获取管理员对象 * - * @param {[type]} conditions 条件 - * @param {Function} cb 回调函数 + * @param {[type]} conditions 条件,用于筛选单个管理员,具体内容根据业务需求而定 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为查询到的管理员对象 */ -module.exports.findOne = function(conditions,cb) { - daoModule.findOne("ManagerModel",conditions,cb); +module.exports.findOne = function (conditions, cb) { + // 调用 daoModule 的 findOne 方法,根据条件查询 ManagerModel 类型的对象,传入条件和回调函数 + daoModule.findOne("ManagerModel", conditions, cb); } /** * 通过关键词查询用户 * - * @param {[type]} key 关键词 - * @param {[type]} offset - * @param {[type]} limit - * @param {Function} cb 回调函数 + * @param {[type]} key 关键词,用于筛选用户,可能是用户名的一部分等 + * @param {[type]} offset 分页偏移量,用于分页查询,从第几行开始查询 + * @param {[type]} limit 分页限制,每页显示的数量 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为查询到的管理员列表 */ -module.exports.findByKey = function(key,offset,limit,cb) { - db = databaseModule.getDatabase(); - sql = "SELECT * FROM sp_manager as mgr LEFT JOIN sp_role as role ON mgr.role_id = role.role_id"; - - if(key) { - sql += " WHERE mg_name LIKE ? LIMIT ?,?"; - database.driver.execQuery( - sql - ,["%" + key + "%",offset,limit],function(err,managers){ - if(err) return cb("查询执行出错"); - cb(null,managers); - }); - } else { - sql += " LIMIT ?,? "; - database.driver.execQuery(sql,[offset,limit],function(err,managers){ - if(err) return cb("查询执行出错"); - cb(null,managers); - }); - } +module.exports.findByKey = function (key, offset, limit, cb) { + // 从数据库模块中获取数据库对象 + db = databaseModule.getDatabase(); + // 定义基本的 SQL 查询语句,使用 LEFT JOIN 连接 sp_manager 和 sp_role 表 + sql = "SELECT * FROM sp_manager as mgr LEFT JOIN sp_role as role ON mgr.role_id = role.role_id"; + // 根据是否有关键词进行不同的 SQL 拼接和查询操作 + if (key) { + // 拼接 LIKE 子句,进行模糊查询,并添加 LIMIT 子句进行分页 + sql += " WHERE mg_name LIKE? LIMIT?,?"; + database.driver.execQuery( + sql + , ["%" + key + "%", offset, limit], function (err, managers) { + if (err) return cb("查询执行出错"); + cb(null, managers); + }); + } else { + // 仅添加 LIMIT 子句进行分页 + sql += " LIMIT?,? "; + database.driver.execQuery(sql, [offset, limit], function (err, managers) { + if (err) return cb("查询执行出错"); + cb(null, managers); + }); + } } /** * 判断是否存在管理员 * - * @param {[type]} username 用户名 - * @param {Function} cb 回调函数 - * + * @param {[type]} username 用户名,用于判断该用户名对应的管理员是否存在 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为布尔值表示是否存在 */ -module.exports.exists = function(username,cb) { - var db = databaseModule.getDatabase(); - var Model = db.models.ManagerModel; - Model.exists({"mg_name":username},function(err,isExists){ - if(err) return cb("查询失败"); - cb(null,isExists); - }); +module.exports.exists = function (username, cb) { + // 从数据库模块中获取数据库对象 + var db = databaseModule.getDatabase(); + // 获取 ManagerModel 模型 + var Model = db.models.ManagerModel; + // 调用 Model 的 exists 方法,传入用户名作为条件,查询是否存在 + Model.exists({"mg_name": username}, function (err, isExists) { + if (err) return cb("查询失败"); + cb(null, isExists); + }); } /** * 模糊查询用户数量 * - * @param {[type]} key 关键词 - * @param {Function} cb 回调函数 + * @param {[type]} key 关键词,用于模糊查询用户数量,可能是用户名的一部分等 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为查询到的用户数量 */ -module.exports.countByKey = function(key,cb) { - db = databaseModule.getDatabase(); - sql = "SELECT count(*) as count FROM sp_manager"; - if(key) { - sql += " WHERE mg_name LIKE ?"; - database.driver.execQuery( - sql - ,["%" + key + "%"],function(err,result){ - if(err) return cb("查询执行出错"); - cb(null,result[0]["count"]); - }); - } else { - database.driver.execQuery(sql,function(err,result){ - if(err) return cb("查询执行出错"); - cb(null,result[0]["count"]); - }); - } - +module.exports.countByKey = function (key, cb) { + // 从数据库模块中获取数据库对象 + db = databaseModule.getDatabase(); + // 定义基本的 SQL 查询语句,统计 sp_manager 表中的记录数 + sql = "SELECT count(*) as count FROM sp_manager"; + // 根据是否有关键词进行不同的 SQL 拼接和查询操作 + if (key) { + // 拼接 LIKE 子句,进行模糊查询 + sql += " WHERE mg_name LIKE?"; + database.driver.execQuery( + sql + , ["%" + key + "%"], function (err, result) { + if (err) return cb("查询执行出错"); + // 从查询结果中获取数量 + cb(null, result[0]["count"]); + }); + } else { + database.driver.execQuery(sql, function (err, result) { + if (err) return cb("查询执行出错"); + // 从查询结果中获取数量 + cb(null, result[0]["count"]); + }); + } } /** - * 通过ID获取管理员对象数据 + * 通过 ID 获取管理员对象数据 * - * @param {[type]} id 管理员主键ID - * @param {Function} cb 回调函数 + * @param {[type]} id 管理员主键 ID,用于唯一标识管理员 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为查询到的管理员对象 */ -module.exports.show = function(id,cb) { - daoModule.show("ManagerModel",id,cb); +module.exports.show = function (id, cb) { + // 调用 daoModule 的 show 方法,根据 ID 查询 ManagerModel 类型的对象,传入 ID 和回调函数 + daoModule.show("ManagerModel", id, cb); } /** * 更新管理员信息 * - * @param {[type]} obj 管理员对象 - * @param {Function} cb 回调函数 + * @param {[type]} obj 管理员对象,包含更新后的管理员信息,具体结构取决于数据库表的设计 + * @param {Function} cb 回调函数,用于处理更新操作的结果 + * 当更新操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null */ -module.exports.update = function(obj,cb) { - daoModule.update("ManagerModel",obj.mg_id,obj,cb); +module.exports.update = function (obj, cb) { + // 调用 daoModule 的 update 方法,更新 ManagerModel 类型的对象,传入对象的 mg_id 作为主键和对象信息及回调函数 + daoModule.update("ManagerModel", obj.mg_id, obj, cb); } /** * 删除管理员对象数据 * - * @param {[type]} id 主键ID - * @param {Function} cb 回调函数 + * @param {[type]} id 主键 ID,用于唯一标识要删除的管理员 + * @param {Function} cb 回调函数,用于处理删除操作的结果 + * 当删除操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null */ -module.exports.destroy = function(id,cb) { - daoModule.destroy("ManagerModel",id,function(err){ - if(err) return cb(err); - return cb(null); - }); +module.exports.destroy = function (id, cb) { + // 调用 daoModule 的 destroy 方法,根据 ID 删除 ManagerModel 类型的对象,传入 ID 和自定义的回调函数 + daoModule.destroy("ManagerModel", id, function (err) { + if (err) return cb(err); + return cb(null); + }); } /** * 保存管理员信息 * - * @param {[type]} obj 管理员对象 - * @param {Function} cb 回调函数 + * @param {[type]} obj 管理员对象,包含管理员信息,具体结构取决于数据库表的设计 + * @param {Function} cb 回调函数,用于处理保存操作的结果 + * 当保存操作完成时调用此函数,根据管理员对象是否有 mg_id 决定是创建新的管理员还是更新现有管理员 */ -module.exports.save = function(obj,cb) { - daoModule.show(obj.mg_id,function(err,oldObj){ - if(err) { - daoModule.create("ManagerModel",obj,cb); - } else { - daoModule.update("ManagerModel",obj.mg_id,obj,cb); - } - }) +module.exports.save = function (obj, cb) { + // 调用 daoModule 的 show 方法,根据管理员对象的 mg_id 进行查询 + daoModule.show(obj.mg_id, function (err, oldObj) { + if (err) { + // 若查询出错,可能是不存在该管理员,调用 create 方法创建新的管理员 + daoModule.create("ManagerModel", obj, cb); + } else { + // 若查询成功,调用 update 方法更新现有管理员 + daoModule.update("ManagerModel", obj.mg_id, obj, cb); + } + }) } /** * 获取管理员数量 * - * @param {Function} cb 回调函数 + * @param {Function} cb 回调函数,用于处理查询结果 + * 当查询操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为管理员数量 */ -module.exports.count = function(cb) { - daoModule("ManagerModel",cb); +module.exports.count = function (cb) { + // 调用 daoModule 进行查询,传入 ManagerModel 类型和回调函数,但这里可能存在错误,因为调用方式不完整,应该是调用 daoModule 的某个方法 + daoModule("ManagerModel", cb); } \ No newline at end of file diff --git a/dao/PermissionAPIDAO.js b/dao/PermissionAPIDAO.js index 8fc07a3..dfe5241 100644 --- a/dao/PermissionAPIDAO.js +++ b/dao/PermissionAPIDAO.js @@ -1,50 +1,64 @@ var path = require("path"); +// 引入自定义的 DAO 模块,可能包含了对数据库操作的相关函数 daoModule = require("./DAO"); -databaseModule = require(path.join(process.cwd(),"modules/database")); +// 引入位于 modules/database 目录下的数据库模块,使用 path.join 拼接当前工作目录和相对路径 +databaseModule = require(path.join(process.cwd(), "modules/database")); /** * 获取权限列表 * - * @param {Function} cb 回调函数 + * @param {Function} cb 回调函数,用于处理获取权限列表的结果 + * 当获取权限列表操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若成功,第一个参数为 null,第二个参数为权限列表结果 */ -module.exports.list = function(cb) { - db = databaseModule.getDatabase(); - sql = "SELECT * FROM sp_permission_api as api LEFT JOIN sp_permission as main ON main.ps_id = api.ps_id WHERE main.ps_id is not null"; - database.driver.execQuery(sql,function(err,result){ - if(err) return cb("获取权限列表失败",null); - cb(null,result); - }); +module.exports.list = function (cb) { + // 从数据库模块中获取数据库对象 + db = databaseModule.getDatabase(); + // 定义 SQL 查询语句,使用 LEFT JOIN 连接 sp_permission_api 和 sp_permission 表 + // 筛选出 sp_permission 表的 ps_id 不为空的记录 + sql = "SELECT * FROM sp_permission_api as api LEFT JOIN sp_permission as main ON main.ps_id = api.ps_id WHERE main.ps_id is not null"; + // 执行 SQL 查询操作 + database.driver.execQuery(sql, function (err, result) { + if (err) return cb("获取权限列表失败", null); + cb(null, result); + }); } /** * 权限验证 * - * @param {[type]} rid 角色ID - * @param {[type]} serviceName 服务名 - * @param {[type]} actionName 动作名 - * @param {Function} cb 回调函数 + * @param {[type]} rid 角色 ID,用于标识用户的角色,可能是数字类型,不同角色拥有不同的权限 + * @param {[type]} serviceName 服务名,可能是要访问的服务的名称,例如 API 服务的名称 + * @param {[type]} actionName 动作名,可能是对服务的具体操作名称,例如 GET、POST 等操作 + * @param {Function} cb 回调函数,用于处理权限验证的结果 + * 当权限验证操作完成时调用此函数,若出现错误,第一个参数将包含错误信息,若验证通过,第一个参数为 null,第二个参数为 true;若验证不通过,第一个参数包含相应的错误信息,第二个参数为 false */ -module.exports.authRight = function(rid,serviceName,actionName,cb) { - - // 超级管理员 - if(rid == 0) return cb(null,true); - - // 权限验证 - daoModule.findOne("PermissionAPIModel",{"ps_api_service":serviceName,"ps_api_action":actionName},function(err,permissionAPI){ - console.log("rid => %s,serviceName => %s,actionName => %s",rid,serviceName,actionName); - if(err || !permissionAPI) return cb("无权限访问",false); - - daoModule.findOne("RoleModel",{"role_id":rid},function(err,role){ - console.log(role); - if(err || !role) return cb("获取角色信息失败",false); - ps_ids = role.ps_ids.split(","); - for(idx in ps_ids) { - ps_id = ps_ids[idx]; - if(parseInt(permissionAPI.ps_id) == parseInt(ps_id)) { - return cb(null,true); - } - } - return cb("无权限访问",false); - }); - }); +module.exports.authRight = function (rid, serviceName, actionName, cb) { + // 超级管理员权限验证,若角色 ID 为 0,则直接认为有权限 + if (rid == 0) return cb(null, true); + // 权限验证过程 + // 使用 daoModule 的 findOne 方法查找 PermissionAPIModel 类型的对象 + daoModule.findOne("PermissionAPIModel", {"ps_api_service": serviceName, "ps_api_action": actionName}, function (err, permissionAPI) { + // 打印当前角色 ID、服务名和动作名,方便调试 + console.log("rid => %s,serviceName => %s,actionName => %s", rid, serviceName, actionName); + // 若出现错误或未找到权限 API 对象,认为无权限 + if (err ||!permissionAPI) return cb("无权限访问", false); + // 查找 RoleModel 类型的对象,获取角色信息 + daoModule.findOne("RoleModel", {"role_id": rid}, function (err, role) { + console.log(role); + // 若出现错误或未找到角色对象,认为获取角色信息失败 + if (err ||!role) return cb("获取角色信息失败", false); + // 将角色的 ps_ids 以逗号分隔存储在数组中 + ps_ids = role.ps_ids.split(","); + // 遍历 ps_ids 数组 + for (idx in ps_ids) { + ps_id = ps_ids[idx]; + // 若权限 API 的 ps_id 与角色的某个 ps_id 相等,认为有权限 + if (parseInt(permissionAPI.ps_id) == parseInt(ps_id)) { + return cb(null, true); + } + } + // 若遍历完都不满足条件,认为无权限 + return cb("无权限访问", false); + }); + }); } \ No newline at end of file diff --git a/db/mydb.sql b/db/mydb.sql index 1d2f871..f842913 100644 --- a/db/mydb.sql +++ b/db/mydb.sql @@ -1,125 +1,290 @@ /* Navicat MySQL Data Transfer -Source Server : localhost_3306 -Source Server Version : 50553 -Source Host : localhost:3306 -Source Database : mydb +Source Server : localhost_3306 +-- 源服务器地址 +Source Server Version : 50553 +-- 源服务器MySQL版本 +Source Host : localhost:3306 +-- 源服务器主机地址和端口 +Source Database : mydb +-- 源数据库名称 -Target Server Type : MYSQL -Target Server Version : 50553 -File Encoding : 65001 +Target Server Type : MYSQL + -- 目标服务器类型 +Target Server Version : 50553 +-- 目标服务器MySQL版本 +File Encoding : 65001 +-- 文件编码格式 -Date: 2018-04-14 16:25:28 +Date: 2018-04-14 16:25:28 +-- 脚本生成日期 */ +-- 关闭外键约束检查,以便在数据迁移过程中可以删除和修改表结构 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- --- Table structure for sp_attribute +-- Table structure for sp_attribute -- 属性表的结构定义 -- ---------------------------- + +-- 如果已经存在名为sp_attribute的表,则先删除它 DROP TABLE IF EXISTS `sp_attribute`; + +-- 创建名为sp_attribute的表 CREATE TABLE `sp_attribute` ( - `attr_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', - `attr_name` varchar(32) NOT NULL COMMENT '属性名称', - `cat_id` smallint(5) unsigned NOT NULL COMMENT '外键,类型id', - `attr_sel` enum('only','many') NOT NULL DEFAULT 'only' COMMENT 'only:输入框(唯一) many:后台下拉列表/前台单选框', - `attr_write` enum('manual','list') NOT NULL DEFAULT 'manual' COMMENT 'manual:手工录入 list:从列表选择', - `attr_vals` text NOT NULL COMMENT '可选值列表信息,例如颜色:白色,红色,绿色,多个可选值通过逗号分隔', - `delete_time` int(11) DEFAULT NULL COMMENT '删除时间标志', - PRIMARY KEY (`attr_id`), - KEY `type_id` (`cat_id`) -) ENGINE=InnoDB AUTO_INCREMENT=3803 DEFAULT CHARSET=utf8 COMMENT='属性表'; + `attr_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', +-- 自增主键,用于唯一标识属性 + `attr_name` varchar(32) NOT NULL COMMENT '属性名称', +-- 属性名称,不能为空 + `cat_id` smallint(5) unsigned NOT NULL COMMENT '外键,类型id', +-- 外键,关联到商品类型表的id + `attr_sel` enum('only','many') NOT NULL DEFAULT 'only' COMMENT 'only:输入框(唯一) many:后台下拉列表/前台单选框', +-- 属性选择方式,默认为only,表示唯一值 + `attr_write` enum('manual','list') NOT NULL DEFAULT 'manual' COMMENT 'manual:手工录入 list:从列表选择', +-- 属性值录入方式,默认为manual,表示手工录入 + `attr_vals` text NOT NULL COMMENT '可选值列表信息,例如颜色:白色,红色,绿色,多个可选值通过逗号分隔', -- 可选值列表,用于下拉列表或单选框 + `delete_time` int(11) DEFAULT NULL COMMENT '删除时间标志', +-- 逻辑删除时间标志,用于软删除 + PRIMARY KEY (`attr_id`), +-- 主键约束 + KEY `type_id` (`cat_id`) +-- 为cat_id字段创建索引,提高查询效率 +) ENGINE=InnoDB AUTO_INCREMENT=3803 DEFAULT CHARSET=utf8 COMMENT='属性表'; +-- 表使用InnoDB引擎,默认字符集为utf8,表注释为“属性表” + -- ---------------------------- -- Records of sp_attribute -- ---------------------------- +-- 向sp_attribute表中插入一条记录,表示主观参数-型号,关联商品类型id为1191,选择方式为only,录入方式为manual,可选值为00002,没有删除时间 INSERT INTO `sp_attribute` VALUES ('1', '主观参数-型号', '1191', 'only', 'manual', '00002', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1191,选择方式为only,录入方式为manual,可选值为女士,没有删除时间 INSERT INTO `sp_attribute` VALUES ('2', '实质参数-适用人群', '1191', 'only', 'manual', '女士', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1191,选择方式为many(后台下拉列表/前台单选框),录入方式为list(从列表选择),可选值为多个颜色组合,没有删除时间 INSERT INTO `sp_attribute` VALUES ('3', '颜色', '1191', 'many', 'list', '4条装高腰1662,4条装高腰1661,5条装中腰1305,5条装中腰2006,5条装高腰1665,5条装中腰1543,均码', null); + +-- 插入一条记录,表示主观参数-型号,关联商品类型id为1193,选择方式为only,录入方式为manual,可选值为NK1505,没有删除时间 INSERT INTO `sp_attribute` VALUES ('4', '主观参数-型号', '1193', 'only', 'manual', 'NK1505', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1193,选择方式为only,录入方式为manual,可选值为女士,没有删除时间 INSERT INTO `sp_attribute` VALUES ('5', '实质参数-适用人群', '1193', 'only', 'manual', '女士', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1193,选择方式为many,录入方式为list,可选值为多个颜色组合,没有删除时间 INSERT INTO `sp_attribute` VALUES ('6', '颜色', '1193', 'many', 'list', '淡黄色,紫色,宝蓝,红色,肤色,黑色,白色,均码', null); + +-- 插入一条记录,表示主观参数-品牌,关联商品类型id为1195,选择方式为only,录入方式为manual,可选值为空(可能表示品牌待指定或不限),没有删除时间 INSERT INTO `sp_attribute` VALUES ('7', '主观参数-品牌', '1195', 'only', 'manual', '', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1195,选择方式为many,录入方式为list,可选值为多个颜色组合(这里以组合A-K,L,XXL,M,XL,S表示,可能是尺码和颜色的组合),没有删除时间 INSERT INTO `sp_attribute` VALUES ('8', '颜色', '1195', 'many', 'list', '组合A,组合B,组合C,组合D,组合E,组合F,组合G,组合H,组合I,组合J,组合K,L,XXL,M,XL,S', null); + +-- 插入一条记录,表示主观参数-型号,关联商品类型id为1196,选择方式为only,录入方式为manual,可选值为111,没有删除时间 INSERT INTO `sp_attribute` VALUES ('9', '主观参数-型号', '1196', 'only', 'manual', '111', null); + +-- 插入一条记录,表示实质参数-适用性别,关联商品类型id为1196,选择方式为only,录入方式为manual,可选值为男,没有删除时间 INSERT INTO `sp_attribute` VALUES ('10', '实质参数-适用性别', '1196', 'only', 'manual', '男', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1196,选择方式为many,录入方式为list,可选值为多个颜色组合(包含细条和混色等描述),没有删除时间 INSERT INTO `sp_attribute` VALUES ('11', '颜色', '1196', 'many', 'list', '白色细条,粗条深灰,中灰细条,粗条浅灰,粗条白色,黑色细条,混色细条,粗条本灰,粗条混色,深灰细条,粗条黑色,藏青细条,均码', null); +-- 向sp_attribute表中插入一条记录,表示主观参数-品牌,关联商品类型id为1197,选择方式为only,录入方式为manual,可选值为空(可能表示品牌待指定或不限),没有删除时间 INSERT INTO `sp_attribute` VALUES ('12', '主观参数-品牌', '1197', 'only', 'manual', '', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1197,选择方式为only,录入方式为manual,可选值为情侣,没有删除时间 INSERT INTO `sp_attribute` VALUES ('13', '实质参数-适用人群', '1197', 'only', 'manual', '情侣', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1197,选择方式为many,录入方式为list,可选值为多个颜色组合(包含男袜、女袜及颜色、款式描述),没有删除时间 INSERT INTO `sp_attribute` VALUES ('14', '颜色', '1197', 'many', 'list', '590男袜白色5双,590男袜混色5双,590男袜深灰5双,船袜星条女5双,590男袜深色5双,590男袜黑色5双,船袜菱形男5双,船袜条纹男5双,船袜清爽条纹女5双,船袜波点女5双,590男袜浅灰5双,590男袜藏青5双,船袜素色男5双,船袜竹节男5双,船袜国旗男5双,船袜拼色男5双,船袜迷宫男5双装,船袜素色女5双,均码', null); + +-- 向sp_attribute表中插入一条记录,表示主观参数-品牌,关联商品类型id为1199,选择方式为only,录入方式为manual,可选值为空,没有删除时间 INSERT INTO `sp_attribute` VALUES ('15', '主观参数-品牌', '1199', 'only', 'manual', '', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1199,选择方式为only,录入方式为manual,可选值为男士,没有删除时间 INSERT INTO `sp_attribute` VALUES ('16', '实质参数-适用人群', '1199', 'only', 'manual', '男士', null); + +-- 插入一条记录,表示颜色属性,关联商品类型id为1199,选择方式为many,录入方式为list,可选值为多个颜色及款式组合,没有删除时间 INSERT INTO `sp_attribute` VALUES ('17', '颜色', '1199', 'many', 'list', '黑色5双装,混色5双装,深色混色5双装,藏青5双装,浅灰5双装,白色5双装,深灰5双装,春夏中筒袜,秋冬中筒袜,船袜', null); + +-- 向sp_attribute表中插入一条记录,表示主体-品牌,关联商品类型id为119,选择方式为only,录入方式为manual,可选值为空,没有删除时间 INSERT INTO `sp_attribute` VALUES ('18', '主体-品牌', '119', 'only', 'manual', '', null); + +-- 插入一条记录,表示功效-功效,关联商品类型id为119,选择方式为only,录入方式为manual,可选值为紧肤淡皱、提拉紧致、去妊娠纹,没有删除时间 INSERT INTO `sp_attribute` VALUES ('19', '功效-功效', '119', 'only', 'manual', '紧肤淡皱,提拉紧致,去妊娠纹', null); + +-- 插入一条记录,表示规格-规格,关联商品类型id为119,选择方式为only,录入方式为manual,可选值为瓶装,没有删除时间 INSERT INTO `sp_attribute` VALUES ('20', '规格-规格', '119', 'only', 'manual', '瓶装', null); + +-- 插入一条记录,表示类型属性,关联商品类型id为119,选择方式为many,录入方式为list,可选值为玫瑰精华油、止痒防疤修复精油,没有删除时间 INSERT INTO `sp_attribute` VALUES ('21', '类型', '119', 'many', 'list', '玫瑰精华油,止痒防疤修复精油', null); + +-- 向sp_attribute表中插入一条记录,表示主体-商品名称,关联商品id为11,选择方式为only,录入方式为manual,可选值为PPTV智能电视32C3,没有删除时间 INSERT INTO `sp_attribute` VALUES ('22', '主体-商品名称', '11', 'only', 'manual', 'PPTV智能电视32C3', null); + +-- 插入一条记录,表示显示-曲面属性,关联商品id为11,选择方式为only,录入方式为manual,可选值为否,没有删除时间 INSERT INTO `sp_attribute` VALUES ('23', '显示-曲面', '11', 'only', 'manual', '否', null); + +-- 插入一条记录,表示系统-智能电视属性,关联商品id为11,选择方式为only,录入方式为manual,可选值为智能电视,没有删除时间 INSERT INTO `sp_attribute` VALUES ('24', '系统-智能电视', '11', 'only', 'manual', '智能电视', null); + +-- 插入一条记录(注意:此条语句被截断,未完整给出可选值),表示USB支持格式-USB支持视频格式属性,关联商品id为11,选择方式为only,录入方式为manual,可选值待完整给出,没有删除时间 +-- (假设后续可选值为'MP4,AVI,RMVB'等,但此处以注释形式说明,因为原代码未给出完整可选值) +INSERT INTO `sp_attribute` VALUES ('25', 'USB支持格式-USB支持视频格式', '11', 'only', 'manual', +-- 假设的可选值:'MP4,AVI,RMVB' -- 此处为假设,原代码未提供完整信息 +-- 向sp_attribute表中插入一条记录,表示USB支持的视频格式,关联商品id为11,选择方式为only,录入方式为manual,可选值为多种视频格式,没有删除时间 INSERT INTO `sp_attribute` VALUES ('25', 'USB支持格式-USB支持视频格式', '11', 'only', 'manual', 'AVI,MPG,TS,MOV,MP4,RM,RMVB,VOB', null); + +-- 插入一条记录,表示功耗-整机功率(W),关联商品id为11,选择方式为only,录入方式为manual,可选值为55瓦特,没有删除时间 INSERT INTO `sp_attribute` VALUES ('26', '功耗-整机功率(W)', '11', 'only', 'manual', '55瓦特', null); + +-- 插入一条记录,表示网络-网络连接方式,关联商品id为11,选择方式为only,录入方式为manual,可选值为有线+无线,没有删除时间 INSERT INTO `sp_attribute` VALUES ('27', '网络-网络连接方式', '11', 'only', 'manual', '有线+无线', null); + +-- 插入一条记录,表示端口-USB2.0端口,关联商品id为11,选择方式为only,录入方式为manual,可选值为2个,没有删除时间 INSERT INTO `sp_attribute` VALUES ('28', '端口-USB2.0端口', '11', 'only', 'manual', '2个', null); + +-- 插入一条记录,表示交互设备-语音控制,关联商品id为11,选择方式为only,录入方式为manual,可选值为不支持,没有删除时间 INSERT INTO `sp_attribute` VALUES ('29', '交互设备-语音控制', '11', 'only', 'manual', '不支持', null); + +-- 插入一条记录,表示尺寸,关联商品id为11,选择方式为many,录入方式为list,可选值为多种尺寸和描述,没有删除时间 INSERT INTO `sp_attribute` VALUES ('30', '尺寸', '11', 'many', 'list', '32英寸 千元新旗舰,43英寸 LG硬屏(足球通),55英寸 4K超高清金属机身,65英寸 客厅大屏', null); + +-- 向sp_attribute表中插入一条记录,表示主观参数-型号,关联商品类型id为1200,选择方式为only,录入方式为manual,可选值为1,没有删除时间 INSERT INTO `sp_attribute` VALUES ('31', '主观参数-型号', '1200', 'only', 'manual', '1', null); + +-- 插入一条记录,表示实质参数-适用性别,关联商品类型id为1200,选择方式为only,录入方式为manual,可选值为女,没有删除时间 INSERT INTO `sp_attribute` VALUES ('32', '实质参数-适用性别', '1200', 'only', 'manual', '女', null); + +-- 插入一条记录,表示颜色,关联商品类型id为1200,选择方式为many,录入方式为list,可选值为多种颜色和描述(针对女性),没有删除时间 INSERT INTO `sp_attribute` VALUES ('33', '颜色', '1200', 'many', 'list', '黑色踩脚【适合40至65kg】,肤色踩脚【适合40至65kg】,黑色连脚【适合40至65kg】,肤色连脚【适合40至65kg】,1200D薄绒【秋天5至15度】,2200D双层天鹅绒【3至15度】,2200D龙爪毛【2至15度】,320克加绒加厚【零下10至10度】,360克加绒加厚【零下5至6度】', null); + +-- 向sp_attribute表中插入一条记录,表示主观参数-品牌,关联商品类型id为1203,选择方式为only,录入方式为manual,可选值为空,没有删除时间 INSERT INTO `sp_attribute` VALUES ('34', '主观参数-品牌', '1203', 'only', 'manual', '', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1203,选择方式为only,录入方式为manual,可选值为情侣,没有删除时间 INSERT INTO `sp_attribute` VALUES ('35', '实质参数-适用人群', '1203', 'only', 'manual', '情侣', null); + +-- 插入一条记录,表示颜色,关联商品类型id为1203,选择方式为many,录入方式为list,可选值为多种颜色和尺码,没有删除时间 INSERT INTO `sp_attribute` VALUES ('36', '颜色', '1203', 'many', 'list', '深灰男,大红女,藏青男,浅灰男,紫色女,黑色女,XXL,L,M,XL,XXXL', null); + +-- 向sp_attribute表中插入一条记录,表示主观参数-货号,关联商品类型id为1204,选择方式为only,录入方式为manual,可选值为6215350003,没有删除时间 INSERT INTO `sp_attribute` VALUES ('37', '主观参数-货号', '1204', 'only', 'manual', '6215350003', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1204,选择方式为only,录入方式为manual,可选值为情侣,没有删除时间 INSERT INTO `sp_attribute` VALUES ('38', '实质参数-适用人群', '1204', 'only', 'manual', '情侣', null); + +-- 插入一条记录,表示颜色,关联商品类型id为1204,选择方式为many,录入方式为list,可选值为多种颜色和尺码,没有删除时间 INSERT INTO `sp_attribute` VALUES ('39', '颜色', '1204', 'many', 'list', '紫罗兰女,深灰男,大红男,肤色女,大红女,藏青男,银灰男,玫红女,黑色男,水兰女,酒红男,L,XXL,M,XL,XXXL', null); + +-- 向sp_attribute表中插入一条记录,表示主观参数-货号,关联商品类型id为1207,选择方式为only,录入方式为manual,可选值为6215350003,没有删除时间 INSERT INTO `sp_attribute` VALUES ('40', '主观参数-货号', '1207', 'only', 'manual', '6215350003', null); + +-- 插入一条记录,表示实质参数-适用人群,关联商品类型id为1207,选择方式为only,录入方式为manual,可选值为情侣,没有删除时间 INSERT INTO `sp_attribute` VALUES ('41', '实质参数-适用人群', '1207', 'only', 'manual', '情侣', null); + +-- 插入一条记录,表示颜色,关联商品类型id为1207,选择方式为many,录入方式为list,可选值为多种颜色和尺码,没有删除时间 INSERT INTO `sp_attribute` VALUES ('42', '颜色', '1207', 'many', 'list', '深灰男,大红男,红色女,肤色女,银灰男,藏青男,紫色女,玫红女,黑色女,水兰女,酒红男,深蓝男,粉色女,XXL,L,M,XL,XXXL', null); -INSERT INTO `sp_attribute` VALUES ('43', '主体-品牌', '120', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('44', '规格-规格', '120', 'only', 'manual', '240毫升', null); -INSERT INTO `sp_attribute` VALUES ('45', '功效-功效', '120', 'only', 'manual', '保湿补水', null); -INSERT INTO `sp_attribute` VALUES ('46', '主观参数-品牌', '1210', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('47', '实质参数-适用人群', '1210', 'only', 'manual', '男士', null); -INSERT INTO `sp_attribute` VALUES ('48', '颜色', '1210', 'many', 'list', '酒红加绒+围脖,卡其加绒+围脖,藏青加绒+围脖,咖啡加绒+围脖,灰色加绒+围脖,黑色加绒+围脖,酒红加绒,卡其加绒,藏青加绒,咖啡加绒,灰色加绒,黑色加绒', null); -INSERT INTO `sp_attribute` VALUES ('49', '主观参数-品牌', '1211', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('50', '实质参数-适用人群', '1211', 'only', 'manual', '通用', null); -INSERT INTO `sp_attribute` VALUES ('51', '细节参数-形状', '1211', 'only', 'manual', '长方形', null); -INSERT INTO `sp_attribute` VALUES ('52', '颜色', '1211', 'many', 'list', '5501酒红色,5503驼色,5592中灰色,5533大红格,5510黑色,5506藏青色,5571橙灰色,5515浅灰色,5572红咖色,5577红蓝格,5509大红色,5507咖啡色', null); -INSERT INTO `sp_attribute` VALUES ('53', '基本参数-品牌', '1212', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('54', '外观参数-色系', '1212', 'only', 'manual', '黑色系', null); -INSERT INTO `sp_attribute` VALUES ('55', '主观参数-品牌', '1213', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('56', '实质参数-适用对象', '1213', 'only', 'manual', '青年', null); -INSERT INTO `sp_attribute` VALUES ('57', '细节参数-包装', '1213', 'only', 'manual', '盒装', null); -INSERT INTO `sp_attribute` VALUES ('58', '颜色', '1213', 'many', 'list', 'C号领带,H号领带,A号领带,B号领带,F号领带,Y号领带,K号领带,J号领带', null); -INSERT INTO `sp_attribute` VALUES ('59', '主观参数-品牌', '1214', 'only', 'manual', '', null); +INSERT INTO `sp_attribute` VALUES ('43', '主体-品牌', '120', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,主体-品牌,关联ID为120,类型为only,输入方式为manual,无具体值 +INSERT INTO `sp_attribute` VALUES ('44', '规格-规格', '120', 'only', 'manual', '240毫升', null); +-- 向sp_attribute表中插入一条记录,规格-规格,关联ID为120,类型为only,输入方式为manual,具体值为240毫升 +INSERT INTO `sp_attribute` VALUES ('45', '功效-功效', '120', 'only', 'manual', '保湿补水', null); +-- 向sp_attribute表中插入一条记录,功效-功效,关联ID为120,类型为only,输入方式为manual,具体值为保湿补水 +INSERT INTO `sp_attribute` VALUES ('46', '主观参数-品牌', '1210', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,主观参数-品牌,关联ID为1210,类型为only,输入方式为manual,无具体值 +INSERT INTO `sp_attribute` VALUES ('47', '实质参数-适用人群', '1210', 'only', 'manual', '男士', null); +-- 向sp_attribute表中插入一条记录,实质参数-适用人群,关联ID为1210,类型为only,输入方式为manual,具体值为男士 +INSERT INTO `sp_attribute` VALUES ('48', '颜色', '1210', 'many', 'list', '酒红加绒+围脖,卡其加绒+围脖,藏青加绒+围脖,咖啡加绒+围脖,灰色加绒+围脖,黑色加绒+围脖,酒红加绒,卡其加绒,藏青加绒,咖啡加绒,灰色加绒,黑色加绒', null); +-- 向sp_attribute表中插入一条记录,颜色,关联ID为1210,类型为many,输入方式为list,具体值为多种颜色组合 +INSERT INTO `sp_attribute` VALUES ('49', '主观参数-品牌', '1211', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,主观参数-品牌,关联ID为1211,类型为only,输入方式为manual,无具体值 +INSERT INTO `sp_attribute` VALUES ('50', '实质参数-适用人群', '1211', 'only', 'manual', '通用', null); +-- 向sp_attribute表中插入一条记录,实质参数-适用人群,关联ID为1211,类型为only,输入方式为manual,具体值为通用 +INSERT INTO `sp_attribute` VALUES ('51', '细节参数-形状', '1211', 'only', 'manual', '长方形', null); +-- 向sp_attribute表中插入一条记录,细节参数-形状,关联ID为1211,类型为only,输入方式为manual,具体值为长方形 +INSERT INTO `sp_attribute` VALUES ('52', '颜色', '1211', 'many', 'list', '5501酒红色,5503驼色,5592中灰色,5533大红格,5510黑色,5506藏青色,5571橙灰色,5515浅灰色,5572红咖色,5577红蓝格,5509大红色,5507咖啡色', null); +-- 向sp_attribute表中插入一条记录,颜色,关联ID为1211,类型为many,输入方式为list,具体值为多种颜色 +INSERT INTO `sp_attribute` VALUES ('53', '基本参数-品牌', '1212', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,基本参数-品牌,关联ID为1212,类型为only,输入方式为manual,无具体值 +INSERT INTO `sp_attribute` VALUES ('54', '外观参数-色系', '1212', 'only', 'manual', '黑色系', null); +-- 向sp_attribute表中插入一条记录,外观参数-色系,关联ID为1212,类型为only,输入方式为manual,具体值为黑色系 +INSERT INTO `sp_attribute` VALUES ('55', '主观参数-品牌', '1213', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,主观参数-品牌,关联ID为1213,类型为only,输入方式为manual,无具体值 +INSERT INTO `sp_attribute` VALUES ('56', '实质参数-适用对象', '1213', 'only', 'manual', '青年', null); +-- 向sp_attribute表中插入一条记录,实质参数-适用对象,关联ID为1213,类型为only,输入方式为manual,具体值为青年 +INSERT INTO `sp_attribute` VALUES ('57', '细节参数-包装', '1213', 'only', 'manual', '盒装', null); +-- 向sp_attribute表中插入一条记录,细节参数-包装,关联ID为1213,类型为only,输入方式为manual,具体值为盒装 +INSERT INTO `sp_attribute` VALUES ('58', '颜色', '1213', 'many', 'list', 'C号领带,H号领带,A号领带,B号领带,F号领带,Y号领带,K号领带,J号领带', null); +-- 向sp_attribute表中插入一条记录,颜色,关联ID为1213,类型为many,输入方式为list,具体值为多种领带颜色 +INSERT INTO `sp_attribute` VALUES ('59', '主观参数-品牌', '1214', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,主观参数-品牌,关联ID为1214,类型为only,输入方式为manual,无具体值 INSERT INTO `sp_attribute` VALUES ('60', '实质参数-适用人群', '1214', 'only', 'manual', '通用', null); -INSERT INTO `sp_attribute` VALUES ('61', '颜色', '1214', 'many', 'list', '男款深灰色,男款黑色,男款咖啡色,女款黑色,女款红色,女款灰色,深女款紫色,女款玫红,女款咖啡色', null); -INSERT INTO `sp_attribute` VALUES ('62', '主体-品牌', '1215', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('63', '规格-产品重量', '1215', 'only', 'manual', '35克', null); -INSERT INTO `sp_attribute` VALUES ('64', '主观参数-品牌', '1216', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('65', '实质参数-文胸款式', '1216', 'only', 'manual', 'V型', null); -INSERT INTO `sp_attribute` VALUES ('66', '细节参数-包装', '1216', 'only', 'manual', '袋装', null); -INSERT INTO `sp_attribute` VALUES ('67', '颜色', '1216', 'many', 'list', '肤色,75B,80A,75C,85B,75A,80B,80C', null); -INSERT INTO `sp_attribute` VALUES ('68', '主观参数-型号', '1219', 'only', 'manual', 'L-XXXL', null); -INSERT INTO `sp_attribute` VALUES ('69', '实质参数-适用人群', '1219', 'only', 'manual', '男士', null); -INSERT INTO `sp_attribute` VALUES ('70', '颜色', '1219', 'many', 'list', '5370-3,5370-4,5324浅,5324深,5260A,5260B,5373款,5290款,5915款,5269款,5280款,5279款,5283款,L170,XL175,XXL180,XXXL185', null); -INSERT INTO `sp_attribute` VALUES ('71', '主体-品牌', '121', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('72', '规格-规格', '121', 'only', 'manual', '6# 10ml', null); -INSERT INTO `sp_attribute` VALUES ('73', '功效-功效', '121', 'only', 'manual', '美甲', null); -INSERT INTO `sp_attribute` VALUES ('74', '主观参数-品牌', '1220', 'only', 'manual', '', null); + -- 向sp_attribute表中插入一条记录,实质参数-适用人群,关联ID为1214,类型为only,输入方式为manual,具体值为通用 +INSERT INTO `sp_attribute` VALUES ('61', '颜色', '1214', 'many', 'list', '男款深灰色,男款黑色,男款咖啡色,女款黑色,女款红色,女款灰色,深女款紫色,女款玫红,女款咖啡色', null); + -- 插入颜色属性,多个值,用于商品1214 + +INSERT INTO `sp_attribute` VALUES ('62', '主体-品牌', '1215', 'only', 'manual', '', null); +-- 插入品牌属性,单一值,手动输入,用于商品1215 + +INSERT INTO `sp_attribute` VALUES ('63', '规格-产品重量', '1215', 'only', 'manual', '35克', null); +-- 插入产品重量属性,单一值,手动输入,用于商品1215 + +INSERT INTO `sp_attribute` VALUES ('64', '主观参数-品牌', '1216', 'only', 'manual', '', null); +-- 插入品牌属性,主观参数,单一值,手动输入,用于商品1216 + +INSERT INTO `sp_attribute` VALUES ('65', '实质参数-文胸款式', '1216', 'only', 'manual', 'V型', null); +-- 插入文胸款式属性,实质参数,单一值,手动输入,用于商品1216 + +INSERT INTO `sp_attribute` VALUES ('66', '细节参数-包装', '1216', 'only', 'manual', '袋装', null); +-- 插入包装属性,细节参数,单一值,手动输入,用于商品1216 + +INSERT INTO `sp_attribute` VALUES ('67', '颜色', '1216', 'many', 'list', '肤色,75B,80A,75C,85B,75A,80B,80C', null); +-- 插入颜色属性,多个值,用于商品1216 + +INSERT INTO `sp_attribute` VALUES ('68', '主观参数-型号', '1219', 'only', 'manual', 'L-XXXL', null); +-- 插入型号属性,主观参数,单一值,手动输入,用于商品1219 + +INSERT INTO `sp_attribute` VALUES ('69', '实质参数-适用人群', '1219', 'only', 'manual', '男士', null); +-- 插入适用人群属性,实质参数,单一值,手动输入,用于商品1219 + +INSERT INTO `sp_attribute` VALUES ('70', '颜色', '1219', 'many', 'list', '5370-3,5370-4,5324浅,5324深,5260A,5260B,5373款,5290款,5915款,5269款,5280款,5279款,5283款,L170,XL175,XXL180,XXXL185', null); +-- 插入颜色属性,多个值,用于商品1219 + +INSERT INTO `sp_attribute` VALUES ('71', '主体-品牌', '121', 'only', 'manual', '', null); +-- 插入品牌属性,主体参数,单一值,手动输入,用于商品121 + +INSERT INTO `sp_attribute` VALUES ('72', '规格-规格', '121', 'only', 'manual', '6# 10ml', null); +-- 插入规格属性,单一值,手动输入,用于商品121 + +INSERT INTO `sp_attribute` VALUES ('73', '功效-功效', '121', 'only', 'manual', '美甲', null); +-- 插入功效属性,单一值,手动输入,用于商品121 + +INSERT INTO `sp_attribute` VALUES ('74', '主观参数-品牌', '1220', 'only', 'manual', '', null); +-- 插入品牌属性,主观参数,单一值,手动输入,用于商品1220 + INSERT INTO `sp_attribute` VALUES ('75', '实质参数-适用人群', '1220', 'only', 'manual', '情侣', null); -INSERT INTO `sp_attribute` VALUES ('76', '颜色', '1220', 'many', 'list', '男士圆领麻灰,男士圆领深灰,男士圆领藏青,男士圆领大红,男士圆领中灰,女士圆领大红,女士圆领豆沙红,女士圆领玉色,女士圆领玫红,男士高领麻灰,男士高领深灰,男士高领中灰,男士高领大红,男士高领藏青,女士高领大红,女士高领玫红,女士高领豆沙红,女士高领玉色,V领大红,V领藏青,V领麻灰,165/90,170/95,175/100,180/105,185/110,M165/90,L170/95,XL175/100,XXL180/105,XXXL185/110', null); +-- 插入适用人群属性,实质参数,单一值,手动输入,用于商品1220 + +INSERT INTO `sp_attribute` VALUES ('76', '颜色', '1220', 'many', 'list', '男士圆领麻灰,男士圆领深灰,男士圆领藏青,男士圆领大红,男士圆领中灰,女士圆领大红,女士圆领豆沙红,女士圆领玉色,女士圆领玫红,男士高领麻灰,男士高领深灰,男士高领中灰,男士高领大红,男士高领藏青,女士高领大红,女士高领玫红,女士高领豆沙红,女士高领玉色,V领大红,V领藏青,V领麻灰,165/90,170/95,175/100,180/105,185/110,M165/90,L170/95,XL175/100,XXL180/105,XXXL185/110', null); +-- 插入颜色属性,多个值,用于商品1220 INSERT INTO `sp_attribute` VALUES ('77', '主观参数-品牌', '1221', 'only', 'manual', '', null); INSERT INTO `sp_attribute` VALUES ('78', '实质参数-适用人群', '1221', 'only', 'manual', '情侣', null); INSERT INTO `sp_attribute` VALUES ('79', '颜色', '1221', 'many', 'list', '男款-银灰,女款-夕阳红,男款-铁灰,男款-麻灰,女款-肤色,女款-紫罗兰,男款-藏青,160cm,185cm,170cm,165cm,175cm,180cm', null); -INSERT INTO `sp_attribute` VALUES ('80', '主观参数-品牌', '1222', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('81', '颜色', '1222', 'many', 'list', '4条礼盒装,L,XL,XXL,XXXL', null); -INSERT INTO `sp_attribute` VALUES ('82', '主观参数-品牌', '1224', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('83', '实质参数-袖长', '1224', 'only', 'manual', '长袖', null); -INSERT INTO `sp_attribute` VALUES ('84', '颜色', '1224', 'many', 'list', '8647款,8633款,8651款,8630款,女款L码,女款XL码,女款XXL码,女款M码', null); -INSERT INTO `sp_attribute` VALUES ('85', '主观参数-品牌', '1226', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('86', '颜色', '1226', 'many', 'list', '5条盒装随机色,小码适合80-110斤,大码适合110-130斤', null); +INSERT INTO `sp_attribute` VALUES ('80', '主观参数-品牌', '1222', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,属性ID为80,属性名称为主观参数-品牌,所属商品ID为1222,属性值类型为唯一,输入方式为手动,无默认值 +INSERT INTO `sp_attribute` VALUES ('81', '颜色', '1222', 'many', 'list', '4条礼盒装,L,XL,XXL,XXXL', null); +-- 向sp_attribute表中插入一条记录,属性ID为81,属性名称为颜色,所属商品ID为1222,属性值类型为多选,输入方式为列表选择,默认值为4条礼盒装,L,XL,XXL,XXXL +INSERT INTO `sp_attribute` VALUES ('82', '主观参数-品牌', '1224', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,属性ID为82,属性名称为主观参数-品牌,所属商品ID为1224,属性值类型为唯一,输入方式为手动,无默认值 +INSERT INTO `sp_attribute` VALUES ('83', '实质参数-袖长', '1224', 'only', 'manual', '长袖', null); +-- 向sp_attribute表中插入一条记录,属性ID为83,属性名称为实质参数-袖长,所属商品ID为1224,属性值类型为唯一,输入方式为手动,默认值为长袖 +INSERT INTO `sp_attribute` VALUES ('84', '颜色', '1224', 'many', 'list', '8647款,8633款,8651款,8630款,女款L码,女款XL码,女款XXL码,女款M码', null); +-- 向sp_attribute表中插入一条记录,属性ID为84,属性名称为颜色,所属商品ID为1224,属性值类型为多选,输入方式为列表选择,默认值为8647款,8633款,8651款,8630款,女款L码,女款XL码,女款XXL码,女款M码 +INSERT INTO `sp_attribute` VALUES ('85', '主观参数-品牌', '1226', 'only', 'manual', '', null); +-- 向sp_attribute表中插入一条记录,属性ID为85,属性名称为主观参数-品牌,所属商品ID为1226,属性值类型为唯一,输入方式为手动,无默认值 +INSERT INTO `sp_attribute` VALUES ('86', '颜色', '1226', 'many', 'list', '5条盒装随机色,小码适合80-110斤,大码适合110-130斤', null); +-- 向sp_attribute表中插入一条记录,属性ID为86,属性名称为颜色,所属商品ID为1226,属性值类型为多选,输入方式为列表选择,默认值为5条盒装随机色,小码适合80-110斤,大码适合110-130斤 INSERT INTO `sp_attribute` VALUES ('87', '主观参数-型号', '1227', 'only', 'manual', '2K6331', null); INSERT INTO `sp_attribute` VALUES ('88', '实质参数-适用人群', '1227', 'only', 'manual', '儿童', null); INSERT INTO `sp_attribute` VALUES ('89', '颜色', '1227', 'many', 'list', '绿/粉/黄,均码', null); @@ -156,44 +321,76 @@ INSERT INTO `sp_attribute` VALUES ('119', '材质-商品尺寸', '1238', 'only', INSERT INTO `sp_attribute` VALUES ('120', '颜色', '1238', 'many', 'list', '乐迪包裹造型挎包,乐迪圆形挎包,乐迪蛋壳背包,乐迪造型斗篷,小爱圆形挎包,小爱蛋壳背包', null); INSERT INTO `sp_attribute` VALUES ('121', '主体-品牌', '1239', 'only', 'manual', '', null); INSERT INTO `sp_attribute` VALUES ('122', '规格-包装尺寸', '1239', 'only', 'manual', '900*360*200毫米', null); +-- 向sp_attribute表中插入一条新记录,设置属性ID为123,属性名称为'颜色',所属商品ID为1239,属性类型为'many',表示可以有多个值, +-- 属性输入方式为'list',即列表选择,属性值为多个卡通小鹿的颜色选项,最后一个字段为null,可能表示没有额外的备注或默认值 INSERT INTO `sp_attribute` VALUES ('123', '颜色', '1239', 'many', 'list', '卡通小鹿粉蓝色,卡通小鹿黄绿色,卡通小鹿蓝桔色,卡通小鹿紫玫色,卡通小鹿粉玫色,卡通小鹿绿橘色', null); + +-- 插入一条新记录,设置属性ID为124,属性名称为'主体-品牌',所属商品ID为123,属性类型为'only',表示只能有一个值, +-- 属性输入方式为'manual',即手动输入,属性值为空,可能表示该属性在后续操作中会被填充或该商品没有特定的品牌信息 INSERT INTO `sp_attribute` VALUES ('124', '主体-品牌', '123', 'only', 'manual', '', null); + +-- 插入一条新记录,设置属性ID为125,属性名称为'规格-规格',所属商品ID为123,属性类型为'only',输入方式为'manual', +-- 属性值为'250ml',表示该商品的规格为250毫升 INSERT INTO `sp_attribute` VALUES ('125', '规格-规格', '123', 'only', 'manual', '250ml', null); + +-- 插入一条新记录,设置属性ID为126,属性名称为'功效-功效',所属商品ID为123,属性类型为'only',输入方式为'manual', +-- 属性值为'清洁,淡化异味',表示该商品具有清洁和淡化异味的效果 INSERT INTO `sp_attribute` VALUES ('126', '功效-功效', '123', 'only', 'manual', '清洁,淡化异味', null); + +-- 插入一条新记录,设置属性ID为127,属性名称为'香型',所属商品ID为123,属性类型为'many',输入方式为'list', +-- 属性值为多个香型选项,表示该商品有多种香型可供选择 INSERT INTO `sp_attribute` VALUES ('127', '香型', '123', 'many', 'list', '洋甘菊,百合,蔓越莓', null); -INSERT INTO `sp_attribute` VALUES ('128', '主体-品牌', '1240', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('129', '规格-重量', '1240', 'only', 'manual', '0.8克', null); -INSERT INTO `sp_attribute` VALUES ('130', '颜色', '1240', 'many', 'list', '30个6.5CM海洋球,50个6.5CM海洋球,100个6.5CM海洋球', null); -INSERT INTO `sp_attribute` VALUES ('131', '主体-品牌', '1241', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('132', '材质-包装尺寸', '1241', 'only', 'manual', '630x310x380毫米', null); -INSERT INTO `sp_attribute` VALUES ('133', '颜色', '1241', 'many', 'list', '不倒翁979,健儿球 929,快乐摇马987,摇铃939,欢乐园717,跳跳椅696', null); -INSERT INTO `sp_attribute` VALUES ('134', '主体-品牌', '1242', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('135', '特性-包装尺寸', '1242', 'only', 'manual', '185*3*265毫米', null); -INSERT INTO `sp_attribute` VALUES ('136', '主体-品牌', '1243', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('137', '规格-包装尺寸', '1243', 'only', 'manual', '300*90*175毫米', null); -INSERT INTO `sp_attribute` VALUES ('138', '主体-品牌', '1244', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('139', '材质-实物尺寸', '1244', 'only', 'manual', '60*38*120+76厘米', null); -INSERT INTO `sp_attribute` VALUES ('140', '颜色', '1244', 'many', 'list', '童话游戏屋,投手球池,热带雨林帐篷三件套,星月球池,1.2米圆点球池,海豚投篮球池球池,萤火虫投篮球池,热带雨林隧道', null); + +-- 后续插入语句类似,均为向sp_attribute表中添加新记录,以下是对每条记录的简要说明: + +-- ID 128: 为商品ID 1240设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 129: 为商品ID 1240设置'规格-重量'属性,属性类型为'only',输入方式为'manual',属性值为'0.8克' +-- ID 130: 为商品ID 1240设置'颜色'属性,属性类型为'many',输入方式为'list',属性值为多个海洋球选项 +-- ID 131: 为商品ID 1241设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 132: 为商品ID 1241设置'材质-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'630x310x380毫米' +-- ID 133: 为商品ID 1241设置'颜色'属性,属性类型为'many',输入方式为'list',属性值为多个玩具选项 +-- ID 134: 为商品ID 1242设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 135: 为商品ID 1242设置'特性-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'185*3*265毫米' +-- ID 136: 为商品ID 1243设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 137: 为商品ID 1243设置'规格-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'300*90*175毫米' +-- ID 138: 为商品ID 1244设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 139: 为商品ID 1244设置'材质-实物尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'60*38*120+76厘米' +-- ID 140: 为商品ID 1244设置'颜色'属性,属性类型为'many',输入方式为'list',属性值为多个帐篷或球池选项-- 向sp_attribute表中插入一条新记录,设置属性ID为141,属性名称为'主体-品牌',所属商品ID为1245, +-- 属性类型为'only',表示只能有一个值,属性输入方式为'manual',即手动输入,属性值为空, +-- 可能表示该属性在后续操作中会被填充或该商品没有特定的品牌信息,最后一个字段为null,可能表示没有额外的备注或默认值 INSERT INTO `sp_attribute` VALUES ('141', '主体-品牌', '1245', 'only', 'manual', '', null); + +-- 插入一条新记录,设置属性ID为142,属性名称为'规格-实物尺寸',所属商品ID为1245, +-- 属性类型为'only',输入方式为'manual',属性值为'16厘米',表示该商品的实物尺寸为16厘米 INSERT INTO `sp_attribute` VALUES ('142', '规格-实物尺寸', '1245', 'only', 'manual', '16厘米', null); + +-- 插入一条新记录,设置属性ID为143,属性名称为'颜色',所属商品ID为1245, +-- 属性类型为'many',表示可以有多个值,输入方式为'list',即列表选择, +-- 属性值为多个小猪佩奇的颜色和角色选项,表示该商品有多种颜色和角色可供选择 INSERT INTO `sp_attribute` VALUES ('143', '颜色', '1245', 'many', 'list', '橙色佩奇,蓝色乔治,粉色佩奇,乔治', null); -INSERT INTO `sp_attribute` VALUES ('144', '主体-品牌', '1247', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('145', '规格-实物尺寸', '1247', 'only', 'manual', '20-30cm', null); -INSERT INTO `sp_attribute` VALUES ('146', '颜色', '1247', 'many', 'list', '粉色海马,蓝色海马', null); -INSERT INTO `sp_attribute` VALUES ('147', '主体-类别', '1248', 'only', 'manual', '游戏叠叠乐', null); -INSERT INTO `sp_attribute` VALUES ('148', '规格-包装尺寸', '1248', 'only', 'manual', '285*80*80毫米', null); -INSERT INTO `sp_attribute` VALUES ('149', '51数字叠叠乐', '1248', 'many', 'list', '51数字叠叠乐+锤子,51数字叠叠乐,51数字叠叠乐+锤子,51数字叠叠乐', null); -INSERT INTO `sp_attribute` VALUES ('150', '主体-品牌', '1249', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('151', '规格-包装尺寸', '1249', 'only', 'manual', '250毫米', null); -INSERT INTO `sp_attribute` VALUES ('152', '主体参数-品牌', '124', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('153', '规格参数-包装', '124', 'only', 'manual', '瓶装', null); -INSERT INTO `sp_attribute` VALUES ('154', '其他参数-产品标准号', '124', 'only', 'manual', '。', null); -INSERT INTO `sp_attribute` VALUES ('155', '特性参数-产品剂型', '124', 'only', 'manual', '片剂', null); -INSERT INTO `sp_attribute` VALUES ('156', '主体-品牌', '1251', 'only', 'manual', '', null); -INSERT INTO `sp_attribute` VALUES ('157', '规格-重量', '1251', 'only', 'manual', '7克', null); -INSERT INTO `sp_attribute` VALUES ('158', '主体-适用年龄', '1252', 'only', 'manual', '1-3岁', null); -INSERT INTO `sp_attribute` VALUES ('159', '规格-包装尺寸', '1252', 'only', 'manual', '312*108*273毫米', null); -INSERT INTO `sp_attribute` VALUES ('160', '主体-品牌', '1253', 'only', 'manual', '', null); + +-- 后续插入语句类似,均为向sp_attribute表中添加新记录,以下是对每条记录的简要说明: + +-- ID 144: 为商品ID 1247设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 145: 为商品ID 1247设置'规格-实物尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'20-30cm' +-- ID 146: 为商品ID 1247设置'颜色'属性,属性类型为'many',输入方式为'list',属性值为多个海马的颜色选项 +-- ID 147: 为商品ID 1248设置'主体-类别'属性,属性类型为'only',输入方式为'manual',属性值为'游戏叠叠乐' +-- ID 148: 为商品ID 1248设置'规格-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'285*80*80毫米' +-- ID 149: 为商品ID 1248设置'51数字叠叠乐'属性(可能是特定商品的一个特性或组合),属性类型为'many',输入方式为'list',属性值为多个选项 +-- ID 150: 为商品ID 1249设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 151: 为商品ID 1249设置'规格-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'250毫米' + +-- 接下来的记录是针对商品ID 124的多个属性设置: +-- ID 152: 为商品ID 124设置'主体参数-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 153: 为商品ID 124设置'规格参数-包装'属性,属性类型为'only',输入方式为'manual',属性值为'瓶装' +-- ID 154: 为商品ID 124设置'其他参数-产品标准号'属性,属性类型为'only',输入方式为'manual',属性值为一个点(可能是占位符或错误) +-- ID 155: 为商品ID 124设置'特性参数-产品剂型'属性,属性类型为'only',输入方式为'manual',属性值为'片剂' + +-- ID 156: 为商品ID 1251设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 +-- ID 157: 为商品ID 1251设置'规格-重量'属性,属性类型为'only',输入方式为'manual',属性值为'7克' +-- ID 158: 为商品ID 1252设置'主体-适用年龄'属性,属性类型为'only',输入方式为'manual',属性值为'1-3岁' +-- ID 159: 为商品ID 1252设置'规格-包装尺寸'属性,属性类型为'only',输入方式为'manual',属性值为'312*108*273毫米' +-- ID 160: 为商品ID 1253设置'主体-品牌'属性,属性类型为'only',输入方式为'manual',属性值为空 INSERT INTO `sp_attribute` VALUES ('161', '规格-包装尺寸', '1253', 'only', 'manual', '635.25毫米', null); INSERT INTO `sp_attribute` VALUES ('162', '电源-充电', '1253', 'only', 'manual', '否', null); INSERT INTO `sp_attribute` VALUES ('163', '颜色', '1253', 'many', 'list', '一辆装,二十辆装,五十辆装,十辆装', null); @@ -13530,368 +13727,542 @@ INSERT INTO `sp_order` VALUES ('67', '1', 'itcast-g7kmck71vjaujfgoi', '20.00', ' INSERT INTO `sp_order` VALUES ('68', '1', 'itcast-g7kmck725jaujgdts', '40.00', '0', '否', '', '个人', '', '', '', '0', '1512535620', '1512535620'); -- ---------------------------- +-- 以下注释表明这段代码是关于 `sp_order_goods` 表结构相关的部分,起到一个分隔、标识作用,便于阅读代码时区分不同模块 -- Table structure for sp_order_goods -- ---------------------------- +-- 如果 `sp_order_goods` 表存在,则删除该表,常用于在重新创建表等操作前避免旧表造成冲突 DROP TABLE IF EXISTS `sp_order_goods`; +-- 创建名为 `sp_order_goods` 的表,定义了表的结构,包含各列的名称、数据类型、默认值以及约束等相关设置,同时对表添加了相关注释说明其用途 CREATE TABLE `sp_order_goods` ( + -- 定义 `id` 列,数据类型为无符号整数,长度为10位,设置为非空且自增,作为主键用于唯一标识每条记录,后面的 COMMENT '主键id' 是对该列含义的注释说明 `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', + -- 定义 `order_id` 列,数据类型为无符号整数,长度为10位,设置为非空,用于存储订单的唯一标识id,后面的 COMMENT '订单id' 解释了该列用途 `order_id` int(10) unsigned NOT NULL COMMENT '订单id', + -- 定义 `goods_id` 列,数据类型为无符号中等整数,长度为8位,设置为非空,用于存放商品的唯一标识id,后面的 COMMENT '商品id' 表明其含义 `goods_id` mediumint(8) unsigned NOT NULL COMMENT '商品id', + -- 定义 `goods_price` 列,数据类型为定点数,总长度为10位,小数点后保留2位,设置为非空且默认值为 '0.00',用于记录商品的单价,后面的 COMMENT '商品单价' 说明了该列作用 `goods_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品单价', + -- 定义 `goods_number` 列,数据类型为无符号微小整数,长度为4位,设置为非空且默认值为 '1',用于表示购买单个商品的数量,后面的 COMMENT '购买单个商品数量' 解释了其意义 `goods_number` tinyint(4) NOT NULL DEFAULT '1' COMMENT '购买单个商品数量', + -- 定义 `goods_total_price` 列,数据类型为定点数,总长度为10位,小数点后保留2位,设置为非空且默认值为 '0.00',用于存储商品的小计价格(通常是单价乘以数量的结果),后面的 COMMENT '商品小计价格' 对其进行说明 `goods_total_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '商品小计价格', + -- 将 `id` 列设置为主键,确保表中每条记录能通过该主键唯一区分,保证数据的唯一性和完整性 PRIMARY KEY (`id`), + -- 创建名为 `order_id` 的索引,用于提高基于订单id进行查询等操作的效率(具体根据业务中查询订单相关商品的频繁程度等场景来看) KEY `order_id` (`order_id`), + -- 创建名为 `goods_id` 的索引,用于提高基于商品id进行查询等操作的效率(比如查询某个商品在哪些订单中出现等场景) KEY `goods_id` (`goods_id`) ) ENGINE=InnoDB AUTO_INCREMENT=86 DEFAULT CHARSET=utf8 COMMENT='商品订单关联表'; -- ---------------------------- +-- 以下注释说明这段代码是关于 `sp_order_goods` 表相关记录的部分,起到分隔、标识作用,便于区分不同内容 -- Records of sp_order_goods -- ---------------------------- +-- 向 `sp_order_goods` 表中插入一条数据,'50' 可能是用于标识该条记录的编号(也可能是按顺序生成的自增id等情况),'1' 作为 `order_id` 表示对应的订单id,'66' 是 `goods_id` 即商品id,'111.00' 为商品单价,'1' 是购买单个商品数量,'111.00' 是商品小计价格(此处刚好单价乘以数量) INSERT INTO `sp_order_goods` VALUES ('50', '1', '66', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'51' 作为这条记录的编号,同样 `order_id` 为 '1' 表示属于同一个订单,'67' 是商品id,各价格和数量相关值按对应含义理解,与上条记录类似共同构成该订单下不同商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('51', '1', '67', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'52' 是该条记录的编号,订单id为 '1',商品id为 '92',商品单价 '111.00',购买数量为 '3',商品小计价格为 '333.00'(是单价乘以数量的结果) INSERT INTO `sp_order_goods` VALUES ('52', '1', '92', '111.00', '3', '333.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'53' 作为编号,订单id是 '1',商品id为 '8',相关价格和数量按对应含义理解,构成这条商品在该订单中的购买详情信息 INSERT INTO `sp_order_goods` VALUES ('53', '1', '8', '111.00', '2', '222.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'54' 是编号,订单id '1',商品id '92',各价格和数量按相应含义对应,继续补充该订单下不同商品的相关信息 INSERT INTO `sp_order_goods` VALUES ('54', '1', '92', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'55' 作为编号,订单id '1',商品id '8',各属性值按其意义对应,完善该订单内商品的具体情况记录 INSERT INTO `sp_order_goods` VALUES ('55', '1', '8', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'57' 是编号,订单id '1',商品id '92',各属性值按相应含义对应,进一步记录该订单涉及的商品信息 INSERT INTO `sp_order_goods` VALUES ('57', '1', '92', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'58' 作为编号,订单id '1',商品id '8',各属性值按对应含义理解,持续补充该订单中商品的详情 INSERT INTO `sp_order_goods` VALUES ('58', '1', '8', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'60' 是编号,订单id '1',商品id '92',各属性值按相应含义对应,继续丰富该订单下商品相关信息 INSERT INTO `sp_order_goods` VALUES ('60', '1', '92', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'61' 作为编号,订单id '1',商品id '8',各属性值按对应含义理解,不断完善该订单内商品的具体记录 INSERT INTO `sp_order_goods` VALUES ('61', '1', '8', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'63' 是编号,订单id '1',商品id '92',各属性值按相应含义对应,继续补充该订单涉及的商品详情 INSERT INTO `sp_order_goods` VALUES ('63', '1', '92', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'64' 作为编号,订单id '1',商品id '8',各属性值按对应含义理解,持续丰富该订单中商品的具体情况 INSERT INTO `sp_order_goods` VALUES ('64', '1', '8', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'65' 是编号,订单id '1',商品id '92',商品数量为 '3',相应计算出商品小计价格,记录该商品在该订单中的购买信息 INSERT INTO `sp_order_goods` VALUES ('65', '1', '92', '111.00', '3', '333.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'66' 作为编号,订单id '1',商品id '8',各属性值按对应含义理解,继续完善该订单内商品的相关记录 INSERT INTO `sp_order_goods` VALUES ('66', '1', '8', '111.00', '1', '111.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'68' 是编号,订单id '60',商品id '96',商品单价 '333.00',购买数量 '2',商品小计价格 '999.00'(单价乘以数量),记录此订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('68', '60', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'69' 作为编号,订单id '60',商品id '95',商品单价 '666.00',购买数量 '5',商品小计价格 '999.00',记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('69', '60', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'70' 是编号,订单id '61',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('70', '61', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'71' 作为编号,订单id '61',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('71', '61', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'72' 是编号,订单id '62',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('72', '62', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'73' 作为编号,订单id '62',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('73', '62', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'74' 是编号,订单id '63',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('74', '63', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'75' 作为编号,订单id '63',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('75', '63', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'76' 是编号,订单id '64',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('76', '64', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'77' 作为编号,订单id '64',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('77', '64', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'78' 是编号,订单id '65',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('78', '65', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'79' 作为编号,订单id '65',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('79', '65', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'80' 是编号,订单id '66',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('80', '66', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'81' 作为编号,订单id '66',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('81', '66', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'82' 是编号,订单id '67',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('82', '67', '96', '333.00', '2', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'83' 作为编号,订单id '67',商品id '95',各属性值按相应含义对应,记录该订单中此商品的购买信息 INSERT INTO `sp_order_goods` VALUES ('83', '67', '95', '666.00', '5', '999.00'); +-- 向 `sp_order_goods` 表中插入一条数据,'84' 是编号,订单id '68',商品id '96',各属性值按对应含义理解,记录该订单下该商品的购买详情 INSERT INTO `sp_order_goods` VALUES ('84', '68', '96', '333.00', '2', '999.00'); -INSERT INTO `sp_order_goods` VALUES ('85', '68', '95', '666.00', '5', '999.00'); - --- ---------------------------- --- Table structure for sp_permission --- ---------------------------- -DROP TABLE IF EXISTS `sp_permission`; -CREATE TABLE `sp_permission` ( - `ps_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, - `ps_name` varchar(20) NOT NULL COMMENT '权限名称', - `ps_pid` smallint(6) unsigned NOT NULL COMMENT '父id', - `ps_c` varchar(32) NOT NULL DEFAULT '' COMMENT '控制器', - `ps_a` varchar(32) NOT NULL DEFAULT '' COMMENT '操作方法', - `ps_level` enum('0','2','1') NOT NULL DEFAULT '0' COMMENT '权限等级', - PRIMARY KEY (`ps_id`) -) ENGINE=InnoDB AUTO_INCREMENT=160 DEFAULT CHARSET=utf8 COMMENT='权限表'; - --- ---------------------------- --- Records of sp_permission --- ---------------------------- -INSERT INTO `sp_permission` VALUES ('101', '商品管理', '0', '', '', '0'); -INSERT INTO `sp_permission` VALUES ('102', '订单管理', '0', '', 'order', '0'); -INSERT INTO `sp_permission` VALUES ('103', '权限管理', '0', '', '', '0'); -INSERT INTO `sp_permission` VALUES ('104', '商品列表', '101', 'Goods', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('105', '添加商品', '104', 'Goods', 'tianjia', '2'); -INSERT INTO `sp_permission` VALUES ('107', '订单列表', '102', 'Order', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('109', '添加订单', '107', 'Order', 'tianjia', '2'); -INSERT INTO `sp_permission` VALUES ('110', '用户列表', '125', 'Manager', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('111', '角色列表', '103', 'Role', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('112', '权限列表', '103', 'Permission', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('115', '分类参数', '101', 'Type', 'index', '1'); -INSERT INTO `sp_permission` VALUES ('116', '商品修改', '104', 'Goods', 'upd', '2'); -INSERT INTO `sp_permission` VALUES ('117', '商品删除', '104', 'Goods', 'del', '2'); -INSERT INTO `sp_permission` VALUES ('121', '商品分类', '101', '', '', '1'); -INSERT INTO `sp_permission` VALUES ('122', '添加分类', '121', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('123', '删除分类', '121', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('125', '用户管理', '0', '', '', '0'); -INSERT INTO `sp_permission` VALUES ('129', '添加角色', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('130', '删除角色', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('131', '添加用户', '110', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('132', '删除用户', '110', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('133', '更新用户', '110', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('134', '角色授权', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('135', '取消角色授权', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('136', '获取用户详情', '110', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('137', '分配用户角色', '110', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('138', '获取角色列表', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('139', '获取角色详情', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('140', '更新角色信息', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('141', '更新角色权限', '111', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('142', '获取参数列表', '115', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('143', '创建商品参数', '115', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('144', '删除商品参数', '115', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('145', '数据统计', '0', '', '', '0'); -INSERT INTO `sp_permission` VALUES ('146', '数据报表', '145', '', '', '1'); -INSERT INTO `sp_permission` VALUES ('147', '查看权限', '112', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('148', '查看数据', '146', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('149', '获取分类详情', '121', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('150', '更新商品图片', '104', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('151', '更新商品属性', '104', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('152', '更新商品状态', '104', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('153', '获取商品详情', '104', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('154', '订单更新', '107', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('155', '获取订单详情', '107', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('156', '分类参数添加', '101', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('157', '分类参数删除', '101', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('158', '分类参数详情', '101', '', '', '2'); -INSERT INTO `sp_permission` VALUES ('159', '设置管理状态', '110', '', '', '2'); - --- ---------------------------- --- Table structure for sp_permission_api --- ---------------------------- -DROP TABLE IF EXISTS `sp_permission_api`; -CREATE TABLE `sp_permission_api` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `ps_id` int(11) NOT NULL, - `ps_api_service` varchar(255) DEFAULT NULL, - `ps_api_action` varchar(255) DEFAULT NULL, - `ps_api_path` varchar(255) DEFAULT NULL, - `ps_api_order` int(4) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `ps_id` (`ps_id`) -) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=utf8; +-- 向 `sp_order_goods` 表中插入一条数据,'85' 作为编号,订单id '68',商品id '95' -- ---------------------------- +-- 以下注释说明这段代码是关于 `sp_permission_api` 表相关记录的部分,起到分隔、标识作用,便于区分不同内容 -- Records of sp_permission_api -- ---------------------------- +-- 向 `sp_permission_api` 表中插入一条数据,'1' 可能是用于标识该条记录的编号,'101' 含义需结合业务确定,三个 null 表示对应的服务名称、操作行为、访问路径暂未指定或为空,'3' 可能是排序相关的值或者其他特定用途的标识(具体看业务情况) INSERT INTO `sp_permission_api` VALUES ('1', '101', null, null, 'goods', '3'); +-- 向 `sp_permission_api` 表中插入一条数据,'2' 作为这条记录的编号,'102' 具体用途依业务而定,三个 null 表示相关服务、操作行为、访问路径未指定等情况,'4' 或许是排序相关或者其他特定用途的标识(结合业务来看) INSERT INTO `sp_permission_api` VALUES ('2', '102', null, null, 'orders', '4'); +-- 向 `sp_permission_api` 表中插入一条数据,'3' 是该条记录的编号,'103' 含义结合业务判断,三个 null 表示对应的服务、操作、路径暂未指定或为空,'2' 可能是排序等相关用途的标识(具体依业务场景) INSERT INTO `sp_permission_api` VALUES ('3', '103', null, null, 'rights', '2'); +-- 向 `sp_permission_api` 表中插入一条数据,'4' 作为编号,'104' 具体意义依业务确定,'GoodService' 是对应的 API 所属服务名称,'getAllGoods' 是操作行为名称,'goods' 可能是访问路径相关或者关联资源名称,'1' 或许是排序相关的值(具体看业务逻辑) INSERT INTO `sp_permission_api` VALUES ('4', '104', 'GoodService', 'getAllGoods', 'goods', '1'); +-- 向 `sp_permission_api` 表中插入一条数据,'5' 是编号,'105' 含义需结合业务来看,'GoodService' 为 API 所属服务名称,'createGood' 是操作行为名称,'goods' 可能是关联资源名称等,null 表示其他未指定情况(如排序等) INSERT INTO `sp_permission_api` VALUES ('5', '105', 'GoodService', 'createGood', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'6' 作为编号,'107' 具体用途依业务而定,'OrderService' 是 API 所属服务名称,'getAllOrders' 是操作行为名称,'orders' 可能是关联资源名称等,null 表示未指定的排序等情况 INSERT INTO `sp_permission_api` VALUES ('6', '107', 'OrderService', 'getAllOrders', 'orders', null); +-- 向 `sp_permission_api` 表中插入一条数据,'9' 是编号,'109' 含义结合业务场景判断,'OrderService' 为 API 所属服务名称,'createOrder' 是操作行为名称,'orders' 可能是关联资源名称等,null 表示其他未指定情况(如排序等) INSERT INTO `sp_permission_api` VALUES ('9', '109', 'OrderService', 'createOrder', 'orders', null); +-- 向 `sp_permission_api` 表中插入一条数据,'10' 作为编号,'110' 具体意义依业务确定,'ManagerService' 是 API 所属服务名称,'getAllManagers' 是操作行为名称,'users' 可能是关联资源名称等,null 表示未指定的排序等情况 INSERT INTO `sp_permission_api` VALUES ('10', '110', 'ManagerService', 'getAllManagers', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'11' 是编号,'111' 含义需结合业务来看,'RoleService' 为 API 所属服务名称,'getAllRoles' 是操作行为名称,'roles' 可能是关联资源名称等,null 表示其他未指定情况(如排序等) INSERT INTO `sp_permission_api` VALUES ('11', '111', 'RoleService', 'getAllRoles', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'12' 作为编号,'112' 具体用途依业务而定,'RightService' 是 API 所属服务名称,'getAllRights' 是操作行为名称,'rights' 可能是关联资源名称等,null 表示未指定的排序等情况 INSERT INTO `sp_permission_api` VALUES ('12', '112', 'RightService', 'getAllRights', 'rights', null); +-- 向 `sp_permission_api` 表中插入一条数据,'15' 是编号,'115' 含义结合业务场景判断,'CategoryService' 为 API 所属服务名称,'getAttributes' 是操作行为名称,'params' 可能是关联资源名称等,'2' 或许是排序相关的值(具体看业务逻辑) INSERT INTO `sp_permission_api` VALUES ('15', '115', 'CategoryService', 'getAttributes', 'params', '2'); +-- 向 `sp_permission_api` 表中插入一条数据,'16' 作为编号,'116' 具体意义依业务确定,'GoodService' 是 API 所属服务名称,'updateGood' 是操作行为名称,'goods' 可能是关联资源名称等,null 表示未指定的排序等情况 INSERT INTO `sp_permission_api` VALUES ('16', '116', 'GoodService', 'updateGood', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'17' 是编号,'117' 含义需结合业务来看,'GoodService' 为 API 所属服务名称,'deleteGood' 是操作行为名称,'goods' 可能是关联资源名称等,null 表示其他未指定情况(如排序等) INSERT INTO `sp_permission_api` VALUES ('17', '117', 'GoodService', 'deleteGood', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'21' 作为编号,'121' 具体用途依业务而定,'CategoryService' 是 API 所属服务名称,'getAllCategories' 是操作行为名称,'categories' 可能是关联资源名称等,'3' 或许是排序相关的值(具体看业务逻辑) INSERT INTO `sp_permission_api` VALUES ('21', '121', 'CategoryService', 'getAllCategories', 'categories', '3'); -INSERT INTO `sp_permission_api` VALUES ('22', '122', 'CategoryService', 'addCategory', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'22' 是编号,'122' 含义结合业务场景判断,'CategoryService' 为 API 所属服务名称,'addCategory' 是操作行为名称,'categories' 可能是关联资源名称等,null 表示其他未指定情况(如排序等) +INSERT INTO `sp_permission_api` VALUES ('22', '122', 'CategoryService', 'addCategory', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'23' 可能是用于标识该权限记录的编号,'123' 具体含义需结合业务确定,'CategoryService' 表示所属的服务名称,'deleteCategory' 是对应的操作方法名,'categories' 或许是关联的资源名称,null 这里可能表示其他未指定或暂无的相关属性 INSERT INTO `sp_permission_api` VALUES ('23', '123', 'CategoryService', 'deleteCategory', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'25' 作为这条记录的编号,'125' 含义依业务而定,两个 null 表示对应的服务名称、操作方法名暂未指定或为空,'users' 是关联资源名称,'1' 可能是某个特定的标识或属性值(具体看业务场景) INSERT INTO `sp_permission_api` VALUES ('25', '125', null, null, 'users', '1'); +-- 向 `sp_permission_api` 表中插入一条数据,'29' 是该条记录的编号,'129' 含义结合业务判断,'RoleService' 是所属服务名称,'createRole' 为对应的操作方法名,'roles' 是关联资源名称,null 表示其他相关属性暂未指定等情况 INSERT INTO `sp_permission_api` VALUES ('29', '129', 'RoleService', 'createRole', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'30' 作为编号,'130' 具体作用依业务确定,'RoleService' 是所属服务,'deleteRole' 是操作方法名,'roles' 是关联资源名称,null 表示相关未指定属性 INSERT INTO `sp_permission_api` VALUES ('30', '130', 'RoleService', 'deleteRole', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'31' 是编号,'131' 含义需结合业务来看,'ManagerService' 为所属服务名称,'createManager' 是对应的操作方法名,'users' 是关联资源名称,null 表示其他相关未指定情况 INSERT INTO `sp_permission_api` VALUES ('31', '131', 'ManagerService', 'createManager', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'32' 作为编号,'132' 具体用途依业务而定,'ManagerService' 是所属服务,'deleteManager' 是操作方法名,'users' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('32', '132', 'ManagerService', 'deleteManager', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'33' 是编号,'133' 含义结合业务场景判断,'ManagerService' 为所属服务名称,'updateManager' 是对应的操作方法名,'users' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('33', '133', 'ManagerService', 'updateManager', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'34' 作为编号,'134' 具体意义依业务确定,'RoleService' 是所属服务,'updateRoleRight' 是操作方法名,'roles' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('34', '134', 'RoleService', 'updateRoleRight', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'35' 是编号,'135' 含义需结合业务来看,'RoleService' 为所属服务名称,'deleteRoleRight' 是对应的操作方法名,'roles' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('35', '135', 'RoleService', 'deleteRoleRight', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'36' 作为编号,'136' 具体用途依业务而定,'ManagerService' 是所属服务,'getManager' 是操作方法名,'users' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('36', '136', 'ManagerService', 'getManager', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'37' 是编号,'137' 含义结合业务场景判断,'ManagerService' 为所属服务名称,'setRole' 是对应的操作方法名,'users' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('37', '137', 'ManagerService', 'setRole', 'users', null); +-- 向 `sp_permission_api` 表中插入一条数据,'38' 作为编号,'138' 具体意义依业务确定,'RoleService' 是所属服务,'getAllRoles' 是操作方法名,'roles' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('38', '138', 'RoleService', 'getAllRoles', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'39' 是编号,'139' 含义需结合业务来看,'RoleService' 为所属服务名称,'getRoleById' 是对应的操作方法名,'roles' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('39', '139', 'RoleService', 'getRoleById', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'40' 作为编号,'140' 具体用途依业务而定,'RoleService' 是所属服务,'updateRole' 是操作方法名,'roles' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('40', '140', 'RoleService', 'updateRole', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'41' 是编号,'141' 含义结合业务场景判断,'RoleService' 为所属服务名称,'updateRoleRight' 是对应的操作方法名,'roles' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('41', '141', 'RoleService', 'updateRoleRight', 'roles', null); +-- 向 `sp_permission_api` 表中插入一条数据,'42' 作为编号,'142' 具体意义依业务确定,'AttributeService' 是所属服务,'getAttributes' 是操作方法名,'categories' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('42', '142', 'AttributeService', 'getAttributes', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'43' 是编号,'143' 含义需结合业务来看,'AttributeService' 为所属服务名称,'createAttribute' 是对应的操作方法名,'categories' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('43', '143', 'AttributeService', 'createAttribute', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'44' 作为编号,'144' 具体用途依业务而定,'AttributeService' 是所属服务,'deleteAttribute' 是操作方法名,'categories' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('44', '144', 'AttributeService', 'deleteAttribute', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'45' 是编号,'145' 含义结合业务场景判断,两个 null 表示对应的服务名称、操作方法名暂未指定或为空,'reports' 是关联资源名称,'5' 可能是某个特定标识或属性值(具体看业务情况) INSERT INTO `sp_permission_api` VALUES ('45', '145', null, null, 'reports', '5'); +-- 向 `sp_permission_api` 表中插入一条数据,'46' 作为编号,'146' 具体意义依业务确定,两个 null 表示相关服务、操作方法未指定等情况,'reports' 是关联资源名称,null 表示其他未指定属性 INSERT INTO `sp_permission_api` VALUES ('46', '146', null, null, 'reports', null); +-- 向 `sp_permission_api` 表中插入一条数据,'47' 是编号,'147' 含义需结合业务来看,'RightService' 为所属服务名称,'getAllRights' 是对应的操作方法名,'rights' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('47', '147', 'RightService', 'getAllRights', 'rights', null); +-- 向 `sp_permission_api` 表中插入一条数据,'48' 作为编号,'148' 具体用途依业务而定,两个 null 表示相关服务、操作方法未指定等情况,'reports' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('48', '148', null, null, 'reports', null); +-- 向 `sp_permission_api` 表中插入一条数据,'49' 是编号,'149' 含义结合业务场景判断,'CategoryService' 为所属服务名称,'getCategoryById' 是对应的操作方法名,'categories' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('49', '149', 'CategoryService', 'getCategoryById', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'50' 作为编号,'150' 具体意义依业务确定,'GoodService' 是所属服务,'updateGoodPics' 是操作方法名,'goods' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('50', '150', 'GoodService', 'updateGoodPics', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'51' 是编号,'151' 含义需结合业务来看,'GoodService' 为所属服务名称,'updateGoodAttributes' 是对应的操作方法名,'goods' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('51', '151', 'GoodService', 'updateGoodAttributes', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'52' 作为编号,'152' 具体用途依业务而定,'GoodService' 是所属服务,'updateGoodsState' 是操作方法名,'goods' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('52', '152', 'GoodService', 'updateGoodsState', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'53' 是编号,'153' 含义结合业务场景判断,'GoodService' 为所属服务名称,'getGoodById' 是对应的操作方法名,'goods' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('53', '153', 'GoodService', 'getGoodById', 'goods', null); +-- 向 `sp_permission_api` 表中插入一条数据,'54' 作为编号,'154' 具体意义依业务确定,'OrderService' 是所属服务,'updateOrder' 是操作方法名,'orders' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('54', '154', 'OrderService', 'updateOrder', 'orders', null); +-- 向 `sp_permission_api` 表中插入一条数据,'55' 是编号,'155' 含义需结合业务来看,'OrderService' 为所属服务名称,'getOrder' 是对应的操作方法名,'orders' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('55', '155', 'OrderService', 'getOrder', 'orders', null); +-- 向 `sp_permission_api` 表中插入一条数据,'56' 作为编号,'156' 具体用途依业务而定,'CategoryService' 是所属服务,'createAttribute' 是操作方法名,'categories' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('56', '156', 'CategoryService', 'createAttribute', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'57' 是编号,'157' 含义结合业务场景判断,'CategoryService' 为所属服务名称,'deleteAttribute' 是对应的操作方法名,'categories' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('57', '157', 'CategoryService', 'deleteAttribute', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'58' 作为编号,'158' 具体意义依业务确定,'CategoryService' 是所属服务,'attributeById' 是操作方法名,'categories' 是关联资源名称,null 表示未指定的相关属性 INSERT INTO `sp_permission_api` VALUES ('58', '158', 'CategoryService', 'attributeById', 'categories', null); +-- 向 `sp_permission_api` 表中插入一条数据,'59' 是编号,'159' 含义需结合业务来看,'ManagerService' 为所属服务名称,'updateMgrState' 是对应的操作方法名,'users' 是关联资源名称,null 表示其他未指定情况 INSERT INTO `sp_permission_api` VALUES ('59', '159', 'ManagerService', 'updateMgrState', 'users', null); -- ---------------------------- +-- 以下注释说明这段代码是关于 `sp_report_1` 表结构相关的部分,起到分隔、标识作用,便于区分不同内容 -- Table structure for sp_report_1 -- ---------------------------- +-- 如果 `sp_report_1` 表存在,则删除该表,这通常用于在重新创建表等操作前确保之前的同名表不会造成冲突 DROP TABLE IF EXISTS `sp_report_1`; +-- 创建名为 `sp_report_1` 的表,定义了表的结构,包括列的名称、数据类型、约束等信息 CREATE TABLE `sp_report_1` ( + -- 定义 `id` 列,数据类型为整数,长度为8位,设置为非空,并且自增,通常作为主键来唯一标识每条记录 `id` int(8) NOT NULL AUTO_INCREMENT, + -- 定义 `rp1_user_count` 列,数据类型为整数,长度为8位,允许为空,用于存储用户数相关信息,后面的 COMMENT '用户数' 是对该列含义的注释说明 `rp1_user_count` int(8) DEFAULT NULL COMMENT '用户数', + -- 定义 `rp1_area` 列,数据类型为可变长度字符串,最大长度为128,允许为空,用于存储地区相关信息,后面的 COMMENT '地区' 是对该列含义的注释说明 `rp1_area` varchar(128) DEFAULT NULL COMMENT '地区', + -- 定义 `rp1_date` 列,数据类型为日期类型,允许为空,用于存储相关日期信息 `rp1_date` date DEFAULT NULL, + -- 将 `id` 列设置为主键,用于唯一确定表中的每一条记录,保证数据的唯一性和完整性 PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8; -- ---------------------------- +-- 以下注释说明这段代码是关于 `sp_report_1` 表相关记录的部分,起到一个分隔、标识作用,便于阅读代码时区分不同模块 -- Records of sp_report_1 -- ---------------------------- +-- 向 `sp_report_1` 表中插入一条数据,'1' 可能是用于标识该条记录的编号,'2999' 或许是对应的数据指标值(具体含义需结合业务场景确定),'华东' 代表地区名称,'2017-12-27' 是对应的日期 INSERT INTO `sp_report_1` VALUES ('1', '2999', '华东', '2017-12-27'); +-- 向 `sp_report_1` 表中插入一条数据,'2' 作为这条记录的编号,'5090' 是相应的数据指标值,'华南' 是地区名称,'2017-12-27' 是日期 INSERT INTO `sp_report_1` VALUES ('2', '5090', '华南', '2017-12-27'); +-- 向 `sp_report_1` 表中插入一条数据,'3' 是该条记录的编号,'6888' 是对应的数据指标值,'华北' 为地区名称,'2017-12-27' 是日期 INSERT INTO `sp_report_1` VALUES ('3', '6888', '华北', '2017-12-27'); +-- 向 `sp_report_1` 表中插入一条数据,'4' 作为编号,'9991' 是相应的数据指标值,'西部' 是地区名称,'2017-12-27' 是日期 INSERT INTO `sp_report_1` VALUES ('4', '9991', '西部', '2017-12-27'); +-- 向 `sp_report_1` 表中插入一条数据,'5' 是编号,'15212' 是对应的数据指标值,'其他' 为地区名称,'2017-12-27' 是日期 INSERT INTO `sp_report_1` VALUES ('5', '15212', '其他', '2017-12-27'); +-- 向 `sp_report_1` 表中插入一条数据,'6' 作为编号,'3111' 是相应的数据指标值,'华东' 是地区名称,'2017-12-28' 是日期 INSERT INTO `sp_report_1` VALUES ('6', '3111', '华东', '2017-12-28'); +-- 向 `sp_report_1` 表中插入一条数据,'8' 是该条记录的编号,'2500' 是对应的数据指标值,'华南' 为地区名称,'2017-12-28' 是日期 INSERT INTO `sp_report_1` VALUES ('8', '2500', '华南', '2017-12-28'); +-- 向 `sp_report_1` 表中插入一条数据,'9' 作为编号,'4000' 是相应的数据指标值,'华北' 是地区名称,'2017-12-28' 是日期 INSERT INTO `sp_report_1` VALUES ('9', '4000', '华北', '2017-12-28'); +-- 向 `sp_report_1` 表中插入一条数据,'10' 是编号,'4130' 是对应的数据指标值,'西部' 为地区名称,'2017-12-28' 是日期 INSERT INTO `sp_report_1` VALUES ('10', '4130', '西部', '2017-12-28'); +-- 向 `sp_report_1` 表中插入一条数据,'11' 作为编号,'5800' 是相应的数据指标值,'其他' 是地区名称,'2017-12-28' 是日期 INSERT INTO `sp_report_1` VALUES ('11', '5800', '其他', '2017-12-28'); +-- 向 `sp_report_1` 表中插入一条数据,'12' 是编号,'4100' 是对应的数据指标值,'华东' 为地区名称,'2017-12-29' 是日期 INSERT INTO `sp_report_1` VALUES ('12', '4100', '华东', '2017-12-29'); +-- 向 `sp_report_1` 表中插入一条数据,'13' 作为编号,'3400' 是相应的数据指标值,'华南' 是地区名称,'2017-12-29' 是日期 INSERT INTO `sp_report_1` VALUES ('13', '3400', '华南', '2017-12-29'); +-- 向 `sp_report_1` 表中插入一条数据,'14' 是该条记录的编号,'8010' 是对应的数据指标值,'华北' 为地区名称,'2017-12-29' 是日期 INSERT INTO `sp_report_1` VALUES ('14', '8010', '华北', '2017-12-29'); +-- 向 `sp_report_1` 表中插入一条数据,'15' 作为编号,'7777' 是相应的数据指标值,'西部' 是地区名称,'2017-12-29' 是日期 INSERT INTO `sp_report_1` VALUES ('15', '7777', '西部', '2017-12-29'); +-- 向 `sp_report_1` 表中插入一条数据,'16' 是编号,'10241' 是对应的数据指标值,'其他' 为地区名称,'2017-12-29' 是日期 INSERT INTO `sp_report_1` VALUES ('16', '10241', '其他', '2017-12-29'); +-- 向 `sp_report_1` 表中插入一条数据,'17' 作为编号,'3565' 是相应的数据指标值,'华东' 是地区名称,'2017-12-30' 是日期 INSERT INTO `sp_report_1` VALUES ('17', '3565', '华东', '2017-12-30'); +-- 向 `sp_report_1` 表中插入一条数据,'18' 是该条记录的编号,'6000' 是对应的数据指标值,'华南' 为地区名称,'2017-12-30' 是日期 INSERT INTO `sp_report_1` VALUES ('18', '6000', '华南', '2017-12-30'); +-- 向 `sp_report_1` 表中插入一条数据,'19' 作为编号,'12321' 是相应的数据指标值,'华北' 是地区名称,'2017-12-30' 是日期 INSERT INTO `sp_report_1` VALUES ('19', '12321', '华北', '2017-12-30'); +-- 向 `sp_report_1` 表中插入一条数据,'20' 是编号,'12903' 是对应的数据指标值,'西部' 为地区名称,'2017-12-30' 是日期 INSERT INTO `sp_report_1` VALUES ('20', '12903', '西部', '2017-12-30'); +-- 向 `sp_report_1` 表中插入一条数据,'21' 作为编号,'14821' 是相应的数据指标值,'其他' 是地区名称,'2017-12-30' 是日期 INSERT INTO `sp_report_1` VALUES ('21', '14821', '其他', '2017-12-30'); +-- 向 `sp_report_1` 表中插入一条数据,'22' 是编号,'3528' 是对应的数据指标值,'华东' 为地区名称,'2017-12-31' 是日期 INSERT INTO `sp_report_1` VALUES ('22', '3528', '华东', '2017-12-31'); +-- 向 `sp_report_1` 表中插入一条数据,'23' 作为编号,'6400' 是相应的数据指标值,'华南' 是地区名称,'2017-12-31' 是日期 INSERT INTO `sp_report_1` VALUES ('23', '6400', '华南', '2017-12-31'); +-- 向 `sp_report_1` 表中插入一条数据,'24' 是该条记录的编号,'13928' 是对应的数据指标值,'华北' 为地区名称,'2017-12-31' 是日期 INSERT INTO `sp_report_1` VALUES ('24', '13928', '华北', '2017-12-31'); +-- 向 `sp_report_1` 表中插入一条数据,'25' 作为编号,'13098' 是相应的数据指标值,'西部' 是地区名称,'2017-12-31' 是日期 INSERT INTO `sp_report_1` VALUES ('25', '13098', '西部', '2017-12-31'); +-- 向 `sp_report_1` 表中插入一条数据,'26' 是编号,'15982' 是对应的数据指标值,'其他' 为地区名称,'2017-12-31' 是日期 INSERT INTO `sp_report_1` VALUES ('26', '15982', '其他', '2017-12-31'); +-- 向 `sp_report_1` 表中插入一条数据,'27' 作为编号,'6000' 是相应的数据指标值,'华东' 是地区名称,'2018-01-01' 是日期 INSERT INTO `sp_report_1` VALUES ('27', '6000', '华东', '2018-01-01'); +-- 向 `sp_report_1` 表中插入一条数据,'28' 是该条记录的编号,'7800' 是对应的数据指标值,'华南' 为地区名称,'2018-01-01' 是日期 INSERT INTO `sp_report_1` VALUES ('28', '7800', '华南', '2018-01-01'); +-- 向 `sp_report_1` 表中插入一条数据,'29' 作为编号,'12984' 是相应的数据指标值,'华北' 是地区名称,'2018-01-01' 是日期 INSERT INTO `sp_report_1` VALUES ('29', '12984', '华北', '2018-01-01'); +-- 向 `sp_report_1` 表中插入一条数据,'30' 是编号,'14028' 是对应的数据指标值,'西部' 为地区名称,'2018-01-01' 是日期 INSERT INTO `sp_report_1` VALUES ('30', '14028', '西部', '2018-01-01'); +-- 向 `sp_report_1` 表中插入一条数据,'31' 作为编号,'14091' 是相应的数据指标值,'其他' 是地区名称,'2018-01-01' 是日期 INSERT INTO `sp_report_1` VALUES ('31', '14091', '其他', '2018-01-01'); -- ---------------------------- +-- 以下注释说明这段代码是关于 `sp_report_2` 表结构相关的部分,起到分隔、标识作用,便于区分不同内容 -- Table structure for sp_report_2 -- ---------------------------- +-- 如果 `sp_report_2` 表存在,则删除该表,这通常用于在重新创建表等操作前确保之前的同名表不会造成冲突 DROP TABLE IF EXISTS `sp_report_2`; +-- 创建名为 `sp_report_2` 的表,定义了表的结构,包括列的名称、数据类型、约束等信息 CREATE TABLE `sp_report_2` ( + -- 定义 `id` 列,数据类型为整数,长度为8位,设置为非空,并且自增,通常作为主键来唯一标识每条记录 `id` int(8) NOT NULL AUTO_INCREMENT, + -- 定义 `rp2_page` 列,数据类型为可变长度字符串,最大长度为128,允许为空,可能用于存储页面相关信息(具体依业务而定) `rp2_page` varchar(128) DEFAULT NULL, + -- 定义 `rp2_count` 列,数据类型为整数,长度为8位,允许为空,或许用于存储某种统计数量(具体看业务场景) `rp2_count` int(8) DEFAULT NULL, + -- 定义 `rp2_date` 列,数据类型为日期类型,允许为空,可能用于存储相关日期信息 `rp2_date` date DEFAULT NULL, + -- 将 `id` 列设置为主键,用于唯一确定表中的每一条记录,保证数据的唯一性和完整性 PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=117 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sp_report_2 -- ---------------------------- +-- 向 `sp_report_2` 表中插入一条数据,'1' 可能是用于唯一标识该条记录的编号,'首页' 表示对应的页面板块名称,'2001' 或许是该板块相关的某种统计指标数值,'2017-12-28' 是对应的日期信息 INSERT INTO `sp_report_2` VALUES ('1', '首页', '2001', '2017-12-28'); +-- 向 `sp_report_2` 表中插入一条数据,'2' 作为这条记录的编号,'分类' 是相应的页面板块名称,'2401' 为该板块对应的统计数据,'2017-12-28' 是日期 INSERT INTO `sp_report_2` VALUES ('2', '分类', '2401', '2017-12-28'); +-- 向 `sp_report_2` 表中插入一条数据,'3' 是该条记录的编号,'商品列表' 为页面板块名称,'2410' 是与之相关的统计数据,'2017-12-28' 是日期 INSERT INTO `sp_report_2` VALUES ('3', '商品列表', '2410', '2017-12-28'); +-- 向 `sp_report_2` 表中插入一条数据,'4' 作为编号,'商品详情' 是页面板块名称,'4512' 是对应的统计数据,'2017-12-28' 是日期 INSERT INTO `sp_report_2` VALUES ('4', '商品详情', '4512', '2017-12-28'); +-- 向 `sp_report_2` 表中插入一条数据,'5' 是编号,'首页' 代表页面板块名称,'2311' 是相关的统计数据,'2017-12-29' 是日期 INSERT INTO `sp_report_2` VALUES ('5', '首页', '2311', '2017-12-29'); +-- 向 `sp_report_2` 表中插入一条数据,'6' 作为编号,'分类' 是页面板块名称,'3941' 为对应的统计数据,'2017-12-29' 是日期 INSERT INTO `sp_report_2` VALUES ('6', '分类', '3941', '2017-12-29'); +-- 向 `sp_report_2` 表中插入一条数据,'7' 是编号,'商品列表' 为页面板块名称,'4312' 是相关的统计数据,'2017-12-29' 是日期 INSERT INTO `sp_report_2` VALUES ('7', '商品列表', '4312', '2017-12-29'); +-- 向 `sp_report_2` 表中插入一条数据,'8' 作为编号,'商品详情' 是页面板块名称,'1231' 是对应的统计数据,'2017-12-29' 是日期 INSERT INTO `sp_report_2` VALUES ('8', '商品详情', '1231', '2017-12-29'); +-- 向 `sp_report_2` 表中插入一条数据,'9' 是编号,'首页' 代表页面板块名称,'2391' 是相关的统计数据,'2017-12-27' 是日期 INSERT INTO `sp_report_2` VALUES ('9', '首页', '2391', '2017-12-27'); +-- 向 `sp_report_2` 表中插入一条数据,'10' 作为编号,'分类' 是页面板块名称,'1232' 为对应的统计数据,'2017-12-27' 是日期 INSERT INTO `sp_report_2` VALUES ('10', '分类', '1232', '2017-12-27'); +-- 向 `sp_report_2` 表中插入一条数据,'11' 是编号,'商品列表' 为页面板块名称,'1232' 是相关的统计数据,'2017-12-27' 是日期 INSERT INTO `sp_report_2` VALUES ('11', '商品列表', '1232', '2017-12-27'); +-- 向 `sp_report_2` 表中插入一条数据,'12' 作为编号,'商品详情' 是页面板块名称,'1231' 是对应的统计数据,'2017-12-27' 是日期 INSERT INTO `sp_report_2` VALUES ('12', '商品详情', '1231', '2017-12-27'); +-- 向 `sp_report_2` 表中插入一条数据,'13' 是编号,'首页' 代表页面板块名称,'2440' 是相关的统计数据,'2017-12-26' 是日期 INSERT INTO `sp_report_2` VALUES ('13', '首页', '2440', '2017-12-26'); +-- 向 `sp_report_2` 表中插入一条数据,'14' 作为编号,'分类' 是页面板块名称,'3468' 为对应的统计数据,'2017-12-26' 是日期 INSERT INTO `sp_report_2` VALUES ('14', '分类', '3468', '2017-12-26'); +-- 向 `sp_report_2` 表中插入一条数据,'15' 是编号,'商品列表' 为页面板块名称,'3022' 是相关的统计数据,'2017-12-26' 是日期 INSERT INTO `sp_report_2` VALUES ('15', '商品列表', '3022', '2017-12-26'); -INSERT INTO `sp_report_2` VALUES ('16', '商品详情', '3704', '2017-12-26'); +-- 向 `sp_report_2` 表中插入一条数据,'16' 作为编号,'商品详情' 是页面板块名称,'3704' 是对应的统计数据,'2017-12-26' 是日期 +INSERT INTO `sp_report_2` VALUES ('16', '商品详情', '3704', '2017-12-26'); +-- 向 `sp_report_2` 表中插入一条数据,'17' 可能是用于区分不同记录的编号,'首页' 表示对应的页面板块名称,'2455' 或许是该板块相关的统计访问量之类的数据,'2017-12-25' 是对应的日期 INSERT INTO `sp_report_2` VALUES ('17', '首页', '2455', '2017-12-25'); +-- 向 `sp_report_2` 表中插入一条数据,'18' 作为这条记录的编号,'分类' 是相应的页面板块名称,'3165' 为该板块对应的统计数据,'2017-12-25' 是日期 INSERT INTO `sp_report_2` VALUES ('18', '分类', '3165', '2017-12-25'); +-- 向 `sp_report_2` 表中插入一条数据,'19' 是该条记录的编号,'商品列表' 为页面板块名称,'1458' 是与之相关的统计数据,'2017-12-25' 是日期 INSERT INTO `sp_report_2` VALUES ('19', '商品列表', '1458', '2017-12-25'); +-- 向 `sp_report_2` 表中插入一条数据,'20' 作为编号,'商品详情' 是页面板块名称,'2799' 是对应的统计数据,'2017-12-25' 是日期 INSERT INTO `sp_report_2` VALUES ('20', '商品详情', '2799', '2017-12-25'); +-- 向 `sp_report_2` 表中插入一条数据,'21' 是编号,'首页' 代表页面板块名称,'2619' 是相关的统计数据,'2017-12-24' 是日期 INSERT INTO `sp_report_2` VALUES ('21', '首页', '2619', '2017-12-24'); +-- 向 `sp_report_2` 表中插入一条数据,'22' 作为编号,'分类' 是页面板块名称,'3697' 为对应的统计数据,'2017-12-24' 是日期 INSERT INTO `sp_report_2` VALUES ('22', '分类', '3697', '2017-12-24'); +-- 向 `sp_report_2` 表中插入一条数据,'23' 是编号,'商品列表' 为页面板块名称,'3630' 是相关的统计数据,'2017-12-24' 是日期 INSERT INTO `sp_report_2` VALUES ('23', '商品列表', '3630', '2017-12-24'); +-- 向 `sp_report_2` 表中插入一条数据,'24' 作为编号,'商品详情' 是页面板块名称,'3060' 是对应的统计数据,'2017-12-24' 是日期 INSERT INTO `sp_report_2` VALUES ('24', '商品详情', '3060', '2017-12-24'); +-- 向 `sp_report_2` 表中插入一条数据,'25' 是编号,'首页' 代表页面板块名称,'3412' 是相关的统计数据,'2017-12-23' 是日期 INSERT INTO `sp_report_2` VALUES ('25', '首页', '3412', '2017-12-23'); +-- 向 `sp_report_2` 表中插入一条数据,'26' 作为编号,'分类' 是页面板块名称,'3880' 为对应的统计数据,'2017-12-23' 是日期 INSERT INTO `sp_report_2` VALUES ('26', '分类', '3880', '2017-12-23'); +-- 向 `sp_report_2` 表中插入一条数据,'27' 是编号,'商品列表' 为页面板块名称,'2166' 是相关的统计数据,'2017-12-23' 是日期 INSERT INTO `sp_report_2` VALUES ('27', '商品列表', '2166', '2017-12-23'); +-- 向 `sp_report_2` 表中插入一条数据,'28' 作为编号,'商品详情' 是页面板块名称,'1187' 是对应的统计数据,'2017-12-23' 是日期 INSERT INTO `sp_report_2` VALUES ('28', '商品详情', '1187', '2017-12-23'); +-- 向 `sp_report_2` 表中插入一条数据,'29' 是编号,'首页' 代表页面板块名称,'1439' 是相关的统计数据,'2017-12-22' 是日期 INSERT INTO `sp_report_2` VALUES ('29', '首页', '1439', '2017-12-22'); +-- 向 `sp_report_2` 表中插入一条数据,'30' 作为编号,'分类' 是页面板块名称,'2636' 为对应的统计数据,'2017-12-22' 是日期 INSERT INTO `sp_report_2` VALUES ('30', '分类', '2636', '2017-12-22'); +-- 向 `sp_report_2` 表中插入一条数据,'31' 是编号,'商品列表' 为页面板块名称,'1862' 是相关的统计数据,'2017-12-22' 是日期 INSERT INTO `sp_report_2` VALUES ('31', '商品列表', '1862', '2017-12-22'); +-- 向 `sp_report_2` 表中插入一条数据,'32' 作为编号,'商品详情' 是页面板块名称,'3401' 是对应的统计数据,'2017-12-22' 是日期 INSERT INTO `sp_report_2` VALUES ('32', '商品详情', '3401', '2017-12-22'); +-- 向 `sp_report_2` 表中插入一条数据,'33' 是编号,'首页' 代表页面板块名称,'1421' 是相关的统计数据,'2017-12-21' 是日期 INSERT INTO `sp_report_2` VALUES ('33', '首页', '1421', '2017-12-21'); +-- 向 `sp_report_2` 表中插入一条数据,'34' 作为编号,'分类' 是页面板块名称,'1904' 为对应的统计数据,'2017-12-21' 是日期 INSERT INTO `sp_report_2` VALUES ('34', '分类', '1904', '2017-12-21'); +-- 向 `sp_report_2` 表中插入一条数据,'35' 是编号,'商品列表' 为页面板块名称,'1258' 是相关的统计数据,'2017-12-21' 是日期 INSERT INTO `sp_report_2` VALUES ('35', '商品列表', '1258', '2017-12-21'); +-- 向 `sp_report_2` 表中插入一条数据,'36' 作为编号,'商品详情' 是页面板块名称,'2576' 是对应的统计数据,'2017-12-21' 是日期 INSERT INTO `sp_report_2` VALUES ('36', '商品详情', '2576', '2017-12-21'); +-- 向 `sp_report_2` 表中插入一条数据,'37' 是编号,'首页' 代表页面板块名称,'2108' 是相关的统计数据,'2017-12-20' 是日期 INSERT INTO `sp_report_2` VALUES ('37', '首页', '2108', '2017-12-20'); +-- 向 `sp_report_2` 表中插入一条数据,'38' 作为编号,'分类' 是页面板块名称,'1811' 为对应的统计数据,'2017-12-20' 是日期 INSERT INTO `sp_report_2` VALUES ('38', '分类', '1811', '2017-12-20'); +-- 向 `sp_report_2` 表中插入一条数据,'39' 是编号,'商品列表' 为页面板块名称,'1730' 是相关的统计数据,'2017-12-20' 是日期 INSERT INTO `sp_report_2` VALUES ('39', '商品列表', '1730', '2017-12-20'); +-- 向 `sp_report_2` 表中插入一条数据,'40' 作为编号,'商品详情' 是页面板块名称,'2220' 是对应的统计数据,'2017-12-20' 是日期 INSERT INTO `sp_report_2` VALUES ('40', '商品详情', '2220', '2017-12-20'); +-- 向 `sp_report_2` 表中插入一条数据,'41' 是编号,'首页' 代表页面板块名称,'1910' 是相关的统计数据,'2017-12-19' 是日期 INSERT INTO `sp_report_2` VALUES ('41', '首页', '1910', '2017-12-19'); +-- 向 `sp_report_2` 表中插入一条数据,'42' 作为编号,'分类' 是页面板块名称,'1891' 为对应的统计数据,'2017-12-19' 是日期 INSERT INTO `sp_report_2` VALUES ('42', '分类', '1891', '2017-12-19'); +-- 向 `sp_report_2` 表中插入一条数据,'43' 是编号,'商品列表' 为页面板块名称,'2724' 是相关的统计数据,'2017-12-19' 是日期 INSERT INTO `sp_report_2` VALUES ('43', '商品列表', '2724', '2017-12-19'); +-- 向 `sp_report_2` 表中插入一条数据,'44' 作为编号,'商品详情' 是页面板块名称,'3949' 是对应的统计数据,'2017-12-19' 是日期 INSERT INTO `sp_report_2` VALUES ('44', '商品详情', '3949', '2017-12-19'); +-- 向 `sp_report_2` 表中插入一条数据,'45' 是编号,'首页' 代表页面板块名称,'1571' 是相关的统计数据,'2017-12-18' 是日期 INSERT INTO `sp_report_2` VALUES ('45', '首页', '1571', '2017-12-18'); +-- 向 `sp_report_2` 表中插入一条数据,'46' 作为编号,'分类' 是页面板块名称,'1011' 为对应的统计数据,'2017-12-18' 是日期 INSERT INTO `sp_report_2` VALUES ('46', '分类', '1011', '2017-12-18'); +-- 向 `sp_report_2` 表中插入一条数据,'47' 是编号,'商品列表' 为页面板块名称,'2342' 是相关的统计数据,'2017-12-18' 是日期 INSERT INTO `sp_report_2` VALUES ('47', '商品列表', '2342', '2017-12-18'); +-- 向 `sp_report_2` 表中插入一条数据,'48' 作为编号,'商品详情' 是页面板块名称,'1679' 是对应的统计数据,'2017-12-18' 是日期 INSERT INTO `sp_report_2` VALUES ('48', '商品详情', '1679', '2017-12-18'); +-- 向 `sp_report_2` 表中插入一条数据,'49' 是编号,'首页' 代表页面板块名称,'3370' 是相关的统计数据,'2017-12-17' 是日期 INSERT INTO `sp_report_2` VALUES ('49', '首页', '3370', '2017-12-17'); +-- 向 `sp_report_2` 表中插入一条数据,'50' 作为编号,'分类' 是页面板块名称,'1813' 为对应的统计数据,'2017-12-17' 是日期 INSERT INTO `sp_report_2` VALUES ('50', '分类', '1813', '2017-12-17'); +-- 向 `sp_report_2` 表中插入一条数据,'51' 是编号,'商品列表' 为页面板块名称,'3953' 是相关的统计数据,'2017-12-17' 是日期 INSERT INTO `sp_report_2` VALUES ('51', '商品列表', '3953', '2017-12-17'); -INSERT INTO `sp_report_2` VALUES ('52', '商品详情', '1328', '2017-12-17'); +-- 向 `sp_report_2` 表中插入一条数据,'52' 作为编号,'商品详情' 是页面板块名称,'1328' 是对应的统计数据,'2017-12-17' 是日期 +INSERT INTO `sp_report_2` VALUES ('52', '商品详情', '1328', '2017-12-17'); +-- 向 `sp_report_2` 表中插入一条数据,'53' 可能是用于标识该条记录的编号,'首页' 代表对应的页面板块名称,'2780' 或许是该板块相关的统计数值,'2017-12-16' 是对应的日期信息 INSERT INTO `sp_report_2` VALUES ('53', '首页', '2780', '2017-12-16'); +-- 向 `sp_report_2` 表中插入一条数据,'54' 作为这条记录的编号,'分类' 是相应的页面板块名称,'2917' 为该板块对应的统计数值,'2017-12-16' 是日期 INSERT INTO `sp_report_2` VALUES ('54', '分类', '2917', '2017-12-16'); +-- 向 `sp_report_2` 表中插入一条数据,'55' 是该条记录的编号,'商品列表' 为页面板块名称,'2244' 是与之相关的统计数值,'2017-12-16' 是日期 INSERT INTO `sp_report_2` VALUES ('55', '商品列表', '2244', '2017-12-16'); +-- 向 `sp_report_2` 表中插入一条数据,'56' 作为编号,'商品详情' 是页面板块名称,'1472' 是对应的统计数值,'2017-12-16' 是日期 INSERT INTO `sp_report_2` VALUES ('56', '商品详情', '1472', '2017-12-16'); +-- 向 `sp_report_2` 表中插入一条数据,'57' 是编号,'首页' 代表页面板块名称,'2627' 是相关的统计数值,'2017-12-15' 是日期 INSERT INTO `sp_report_2` VALUES ('57', '首页', '2627', '2017-12-15'); +-- 向 `sp_report_2` 表中插入一条数据,'58' 作为编号,'分类' 是页面板块名称,'1719' 为对应的统计数值,'2017-12-15' 是日期 INSERT INTO `sp_report_2` VALUES ('58', '分类', '1719', '2017-12-15'); +-- 向 `sp_report_2` 表中插入一条数据,'59' 是编号,'商品列表' 为页面板块名称,'2713' 是相关的统计数值,'2017-12-15' 是日期 INSERT INTO `sp_report_2` VALUES ('59', '商品列表', '2713', '2017-12-15'); +-- 向 `sp_report_2` 表中插入一条数据,'60' 作为编号,'商品详情' 是页面板块名称,'1412' 是对应的统计数值,'2017-12-15' 是日期 INSERT INTO `sp_report_2` VALUES ('60', '商品详情', '1412', '2017-12-15'); +-- 向 `sp_report_2` 表中插入一条数据,'61' 是编号,'首页' 代表页面板块名称,'3919' 是相关的统计数值,'2017-12-14' 是日期 INSERT INTO `sp_report_2` VALUES ('61', '首页', '3919', '2017-12-14'); +-- 向 `sp_report_2` 表中插入一条数据,'62' 作为编号,'分类' 是页面板块名称,'2360' 为对应的统计数值,'2017-12-14' 是日期 INSERT INTO `sp_report_2` VALUES ('62', '分类', '2360', '2017-12-14'); +-- 向 `sp_report_2` 表中插入一条数据,'63' 是编号,'商品列表' 为页面板块名称,'2045' 是相关的统计数值,'2017-12-14' 是日期 INSERT INTO `sp_report_2` VALUES ('63', '商品列表', '2045', '2017-12-14'); +-- 向 `sp_report_2` 表中插入一条数据,'64' 作为编号,'商品详情' 是页面板块名称,'2144' 是对应的统计数值,'2017-12-14' 是日期 INSERT INTO `sp_report_2` VALUES ('64', '商品详情', '2144', '2017-12-14'); +-- 向 `sp_report_2` 表中插入一条数据,'65' 是编号,'首页' 代表页面板块名称,'3586' 是相关的统计数值,'2017-12-13' 是日期 INSERT INTO `sp_report_2` VALUES ('65', '首页', '3586', '2017-12-13'); +-- 向 `sp_report_2` 表中插入一条数据,'66' 作为编号,'分类' 是页面板块名称,'1498' 为对应的统计数值,'2017-12-13' 是日期 INSERT INTO `sp_report_2` VALUES ('66', '分类', '1498', '2017-12-13'); +-- 向 `sp_report_2` 表中插入一条数据,'67' 是编号,'商品列表' 为页面板块名称,'1733' 是相关的统计数值,'2017-12-13' 是日期 INSERT INTO `sp_report_2` VALUES ('67', '商品列表', '1733', '2017-12-13'); -INSERT INTO `sp_report_2` VALUES ('68', '商品详情', '3174', '2017-12-13'); +-- 向 `sp_report_2` 表中插入一条数据,'68' 作为编号,'商品详情' 是页面板块名称,'3174' 是对应的统计数值,'2017-12-13' 是日期 +INSERT INTO `sp_report_2` VALUES ('68', '商品详情', '3174', '2017-12-13'); +-- 向 `sp_report_2` 表中插入一条数据,'69' 可能是一个特定的记录编号,'首页' 表示对应的页面板块名称,'3668' 或许是该板块相关的统计数据量,'2017-12-12' 是对应的时间日期 INSERT INTO `sp_report_2` VALUES ('69', '首页', '3668', '2017-12-12'); +-- 向 `sp_report_2` 表中插入一条数据,'70' 作为编号,'分类' 是相应的页面板块名称,'1818' 为对应的统计数据量,'2017-12-12' 是日期 INSERT INTO `sp_report_2` VALUES ('70', '分类', '1818', '2017-12-12'); +-- 向 `sp_report_2` 表中插入一条数据,'71' 是编号,'商品列表' 为页面板块名称,'3087' 是相关的统计数据量,'2017-12-12' 是日期 INSERT INTO `sp_report_2` VALUES ('71', '商品列表', '3087', '2017-12-12'); +-- 向 `sp_report_2` 表中插入一条数据,'72' 为编号,'商品详情' 是页面板块名称,'2980' 是对应的统计数据量,'2017-12-12' 是日期 INSERT INTO `sp_report_2` VALUES ('72', '商品详情', '2980', '2017-12-12'); +-- 向 `sp_report_2` 表中插入一条数据,'73' 作为编号,'首页' 是页面板块名称,'1641' 是相关统计数据量,'2017-12-11' 是日期 INSERT INTO `sp_report_2` VALUES ('73', '首页', '1641', '2017-12-11'); +-- 向 `sp_report_2` 表中插入一条数据,'74' 是编号,'分类' 为页面板块名称,'1263' 是对应的统计数据量,'2017-12-11' 是日期 INSERT INTO `sp_report_2` VALUES ('74', '分类', '1263', '2017-12-11'); +-- 向 `sp_report_2` 表中插入一条数据,'75' 为编号,'商品列表' 是页面板块名称,'3396' 是相关统计数据量,'2017-12-11' 是日期 INSERT INTO `sp_report_2` VALUES ('75', '商品列表', '3396', '2017-12-11'); +-- 向 `sp_report_2` 表中插入一条数据,'76' 作为编号,'商品详情' 是页面板块名称,'3191' 是对应的统计数据量,'2017-12-11' 是日期 INSERT INTO `sp_report_2` VALUES ('76', '商品详情', '3191', '2017-12-11'); +-- 向 `sp_report_2` 表中插入一条数据,'77' 是编号,'首页' 为页面板块名称,'1769' 是相关统计数据量,'2017-12-10' 是日期 INSERT INTO `sp_report_2` VALUES ('77', '首页', '1769', '2017-12-10'); +-- 向 `sp_report_2` 表中插入一条数据,'78' 作为编号,'分类' 是页面板块名称,'1269' 是对应的统计数据量,'2017-12-10' 是日期 INSERT INTO `sp_report_2` VALUES ('78', '分类', '1269', '2017-12-10'); +-- 向 `sp_report_2` 表中插入一条数据,'79' 为编号,'商品列表' 是页面板块名称,'3041' 是相关统计数据量,'2017-12-10' 是日期 INSERT INTO `sp_report_2` VALUES ('79', '商品列表', '3041', '2017-12-10'); +-- 向 `sp_report_2` 表中插入一条数据,'80' 作为编号,'商品详情' 是页面板块名称,'1396' 是对应的统计数据量,'2017-12-10' 是日期 INSERT INTO `sp_report_2` VALUES ('80', '商品详情', '1396', '2017-12-10'); +-- 向 `sp_report_2` 表中插入一条数据,'81' 是编号,'首页' 为页面板块名称,'2860' 是相关统计数据量,'2017-12-01' 是日期 INSERT INTO `sp_report_2` VALUES ('81', '首页', '2860', '2017-12-01'); +-- 向 `sp_report_2` 表中插入一条数据,'82' 作为编号,'分类' 是页面板块名称,'3111' 是对应的统计数据量,'2017-12-01' 是日期 INSERT INTO `sp_report_2` VALUES ('82', '分类', '3111', '2017-12-01'); +-- 向 `sp_report_2` 表中插入一条数据,'83' 为编号,'商品列表' 是页面板块名称,'2975' 是相关统计数据量,'2017-12-01' 是日期 INSERT INTO `sp_report_2` VALUES ('83', '商品列表', '2975', '2017-12-01'); +-- 向 `sp_report_2` 表中插入一条数据,'84' 作为编号,'商品详情' 是页面板块名称,'1542' 是对应的统计数据量,'2017-12-01' 是日期 INSERT INTO `sp_report_2` VALUES ('84', '商品详情', '1542', '2017-12-01'); +-- 向 `sp_report_2` 表中插入一条数据,'85' 是编号,'首页' 为页面板块名称,'3786' 是相关统计数据量,'2017-12-02' 是日期 INSERT INTO `sp_report_2` VALUES ('85', '首页', '3786', '2017-12-02'); +-- 向 `sp_report_2` 表中插入一条数据,'86' 作为编号,'分类' 是页面板块名称,'1304' 是对应的统计数据量,'2017-12-02' 是日期 INSERT INTO `sp_report_2` VALUES ('86', '分类', '1304', '2017-12-02'); +-- 向 `sp_report_2` 表中插入一条数据,'87' 为编号,'商品列表' 是页面板块名称,'3163' 是相关统计数据量,'2017-12-02' 是日期 INSERT INTO `sp_report_2` VALUES ('87', '商品列表', '3163', '2017-12-02'); +-- 向 `sp_report_2` 表中插入一条数据,'88' 作为编号,'商品详情' 是页面板块名称,'1903' 是对应的统计数据量,'2017-12-02' 是日期 INSERT INTO `sp_report_2` VALUES ('88', '商品详情', '1903', '2017-12-02'); -INSERT INTO `sp_report_2` VALUES ('89', '首页', '2028', '2017-12-03'); +-- 向 `sp_report_2` 表中插入一条数据,'89' 是编号,'首页' 为页面板块名称,'2028' 是相关统计数据量,'2017-12-03' 是日期 +INSERT INTO `sp_report_2` VALUES ('89', '首页', '2028', '2017-12-03'); +-- 向 `sp_report_2` 表中插入一条数据,'90' 可能是某个特定的编号,'分类' 表示对应板块名称,'3429' 或许是相关的统计数值,'2017-12-03' 是对应的时间日期 INSERT INTO `sp_report_2` VALUES ('90', '分类', '3429', '2017-12-03'); +-- 向 `sp_report_2` 表中插入一条数据,'91' 作为编号,'商品列表' 是板块名称,'1061' 为相应的统计数值,'2017-12-03' 是日期 INSERT INTO `sp_report_2` VALUES ('91', '商品列表', '1061', '2017-12-03'); +-- 向 `sp_report_2` 表中插入一条数据,'92' 是编号,'商品详情' 为板块名称,'3019' 是统计数值,'2017-12-03' 是日期 INSERT INTO `sp_report_2` VALUES ('92', '商品详情', '3019', '2017-12-03'); +-- 向 `sp_report_2` 表中插入一条数据,'93' 为编号,'首页' 是板块名称,'1913' 是统计数值,'2017-12-04' 是日期 INSERT INTO `sp_report_2` VALUES ('93', '首页', '1913', '2017-12-04'); +-- 向 `sp_report_2` 表中插入一条数据,'94' 作为编号,'分类' 是板块名称,'2510' 是统计数值,'2017-12-04' 是日期 INSERT INTO `sp_report_2` VALUES ('94', '分类', '2510', '2017-12-04'); +-- 向 `sp_report_2` 表中插入一条数据,'95' 是编号,'商品列表' 为板块名称,'2812' 是统计数值,'2017-12-04' 是日期 INSERT INTO `sp_report_2` VALUES ('95', '商品列表', '2812', '2017-12-04'); +-- 向 `sp_report_2` 表中插入一条数据,'96' 为编号,'商品详情' 是板块名称,'2528' 是统计数值,'2017-12-04' 是日期 INSERT INTO `sp_report_2` VALUES ('96', '商品详情', '2528', '2017-12-04'); +-- 向 `sp_report_2` 表中插入一条数据,'97' 作为编号,'首页' 是板块名称,'3206' 是统计数值,'2017-12-05' 是日期 INSERT INTO `sp_report_2` VALUES ('97', '首页', '3206', '2017-12-05'); +-- 向 `sp_report_2` 表中插入一条数据,'98' 是编号,'分类' 为板块名称,'1445' 是统计数值,'2017-12-05' 是日期 INSERT INTO `sp_report_2` VALUES ('98', '分类', '1445', '2017-12-05'); +-- 向 `sp_report_2` 表中插入一条数据,'99' 为编号,'商品列表' 是板块名称,'2610' 是统计数值,'2017-12-05' 是日期 INSERT INTO `sp_report_2` VALUES ('99', '商品列表', '2610', '2017-12-05'); +-- 向 `sp_report_2` 表中插入一条数据,'100' 是编号,'商品详情' 为板块名称,'1716' 是统计数值,'2017-12-05' 是日期 INSERT INTO `sp_report_2` VALUES ('100', '商品详情', '1716', '2017-12-05'); +-- 向 `sp_report_2` 表中插入一条数据,'101' 作为编号,'首页' 是板块名称,'2750' 是统计数值,'2017-12-06' 是日期 INSERT INTO `sp_report_2` VALUES ('101', '首页', '2750', '2017-12-06'); +-- 向 `sp_report_2` 表中插入一条数据,'102' 是编号,'分类' 为板块名称,'1601' 是统计数值,'2017-12-06' 是日期 INSERT INTO `sp_report_2` VALUES ('102', '分类', '1601', '2017-12-06'); -INSERT INTO `sp_report_2` VALUES ('103', '商品列表', '1755', '2017-12-06'); +-- 向 `sp_report_2` 表中插入一条数据,'103' 为编号,'商品列表' 是板块名称,'1755' 是统计数值,'2017-12-06' 是日期 +INSERT INTO `sp_report_2` VALUES ('103', '商品列表', '1755', '2017-12-06'); +-- 向 `sp_report_2` 表中插入一条数据,'104' 可能是某种编号,'商品详情' 表示对应的板块名称,'2974' 或许是相关的统计数量,'2017-12-06' 是对应的日期 INSERT INTO `sp_report_2` VALUES ('104', '商品详情', '2974', '2017-12-06'); +-- 向 `sp_report_2` 表中插入一条数据,'105' 为编号,'首页' 是板块名称,'2606' 为统计数量,'2017-12-07' 是日期 INSERT INTO `sp_report_2` VALUES ('105', '首页', '2606', '2017-12-07'); +-- 向 `sp_report_2` 表中插入一条数据,'106' 作为编号,'分类' 是相应板块,'3110' 是统计数量,'2017-12-07' 为日期 INSERT INTO `sp_report_2` VALUES ('106', '分类', '3110', '2017-12-07'); +-- 向 `sp_report_2` 表中插入一条数据,'107' 是编号,'商品列表' 为板块名称,'3731' 是统计数量,'2017-12-07' 是日期 INSERT INTO `sp_report_2` VALUES ('107', '商品列表', '3731', '2017-12-07'); +-- 向 `sp_report_2` 表中插入一条数据,'108' 是编号,'商品详情' 是板块名称,'2324' 是统计数量,'2017-12-07' 是日期 INSERT INTO `sp_report_2` VALUES ('108', '商品详情', '2324', '2017-12-07'); +-- 向 `sp_report_2` 表中插入一条数据,'109' 为编号,'首页' 是板块名称,'2429' 是统计数量,'2017-12-08' 是日期 INSERT INTO `sp_report_2` VALUES ('109', '首页', '2429', '2017-12-08'); +-- 向 `sp_report_2` 表中插入一条数据,'110' 作为编号,'分类' 是板块名称,'1172' 是统计数量,'2017-12-08' 是日期 INSERT INTO `sp_report_2` VALUES ('110', '分类', '1172', '2017-12-08'); +-- 向 `sp_report_2` 表中插入一条数据,'111' 是编号,'商品列表' 为板块名称,'3574' 是统计数量,'2017-12-08' 是日期 INSERT INTO `sp_report_2` VALUES ('111', '商品列表', '3574', '2017-12-08'); +-- 向 `sp_report_2` 表中插入一条数据,'112' 是编号,'商品详情' 是板块名称,'1354' 是统计数量,'2017-12-08' 是日期 INSERT INTO `sp_report_2` VALUES ('112', '商品详情', '1354', '2017-12-08'); +-- 向 `sp_report_2` 表中插入一条数据,'113' 为编号,'首页' 是板块名称,'1051' 是统计数量,'2017-12-09' 是日期 INSERT INTO `sp_report_2` VALUES ('113', '首页', '1051', '2017-12-09'); +-- 向 `sp_report_2` 表中插入一条数据,'114' 作为编号,'分类' 是板块名称,'3190' 是统计数量,'2017-12-09' 是日期 INSERT INTO `sp_report_2` VALUES ('114', '分类', '3190', '2017-12-09'); +-- 向 `sp_report_2` 表中插入一条数据,'115' 是编号,'商品列表' 为板块名称,'2800' 是统计数量,'2017-12-09' 是日期 INSERT INTO `sp_report_2` VALUES ('115', '商品列表', '2800', '2017-12-09'); +-- 向 `sp_report_2` 表中插入一条数据,'116' 是编号,'商品详情' 是板块名称,'3431' 是统计数量,'2017-12-09' 是日期 INSERT INTO `sp_report_2` VALUES ('116', '商品详情', '3431', '2017-12-09'); - -- ---------------------------- -- Table structure for sp_report_3 -- ---------------------------- @@ -13998,4 +14369,7 @@ CREATE TABLE `sp_user_cart` ( -- ---------------------------- INSERT INTO `sp_user_cart` VALUES ('19', '5764', 'a:1:{s:32:\"84c7dfb6cb829817f6de9e7c9506d6f4\";a:10:{s:8:\"goods_id\";i:77;s:10:\"goods_name\";s:14:\"小米手机22\";s:11:\"goods_price\";s:6:\"111.00\";s:16:\"goods_small_logo\";s:67:\"./uploads/goods/20171017/small_9d5cccb340525d3f0652fd327cfb178b.jpg\";s:16:\"goods_buy_number\";i:1;s:14:\"goods_cart_uid\";s:32:\"84c7dfb6cb829817f6de9e7c9506d6f4\";s:7:\"user_id\";i:5764;s:4:\"time\";d:1509438617.630688;s:5:\"queue\";b:1;s:18:\"goods_price_xiaoji\";d:111;}}', null, null, null); INSERT INTO `sp_user_cart` VALUES ('20', '7505', 'a:1:{s:32:\"65927e4ef01cf6ab4b2764bea2f4ffba\";a:10:{s:8:\"goods_id\";i:76;s:10:\"goods_name\";s:14:\"华为闪耀33\";s:11:\"goods_price\";s:6:\"111.00\";s:16:\"goods_small_logo\";s:67:\"./uploads/goods/20171017/small_6a666c60fb4a9bd4fe462a04f4318019.jpg\";s:16:\"goods_buy_number\";i:1;s:14:\"goods_cart_uid\";s:32:\"65927e4ef01cf6ab4b2764bea2f4ffba\";s:7:\"user_id\";i:7505;s:4:\"time\";d:1509438621.5471151;s:5:\"queue\";b:1;s:18:\"goods_price_xiaoji\";d:111;}}', null, null, null); +-- 向sp_user_cart表中插入一条记录,用户购物车ID为20,用户ID为7505,购物车内容为序列化后的数组(包含商品ID、名称、价格等信息),其他字段为null + INSERT INTO `sp_user_cart` VALUES ('21', '1', '[{\"goods_id\":92,\"amount\":2},{\"goods_id\":94,\"amount\":2},{\"goods_id\":76,\"amount\":2},{\"goods_id\":75,\"amount\":1},{\"goods_id\":73,\"amount\":1}]', null, null, null); +-- 向sp_user_cart表中插入一条记录,用户购物车ID为21,用户ID为1,购物车内容为JSON格式的字符串(包含商品ID和购买数量),其他字段为null \ No newline at end of file diff --git a/models/AttributeModel.js b/models/AttributeModel.js index 914f53b..7e9c62d 100644 --- a/models/AttributeModel.js +++ b/models/AttributeModel.js @@ -1,15 +1,50 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("AttributeModel",{ - attr_id : {type: 'serial', key: true}, - attr_name : String, - cat_id : Number, - attr_sel : ["only", "many"], // only:输入框(唯一) many:后台下拉列表/前台单选框 - attr_write: ["manual","list"], // manual:手工录入 list:从列表选择 - attr_vals: String, - delete_time : Number - },{ - table : "sp_attribute" - }); - return callback(); +/// 导出一个函数,这个函数是模块的主要接口,它接受两个参数: +// 第一个参数是数据库对象db,它提供了与数据库进行交互的能力; +// 第二个参数是一个回调函数callback,它将在模型定义成功后被调用。 +module.exports = function(db, callback) { + // 开始使用db.define方法定义一个名为"AttributeModel"的模型。 + // 这个模型用于表示商品或产品的属性。 + db.define("AttributeModel", { + // 以下是该模型属性的定义部分: + + // attr_id属性:作为主键,其类型为'serial',表示这是一个自增的序列号。 + // key: true表明这个属性是主键,用于唯一标识每条记录。 + attr_id: {type: 'serial', key: true}, + + // attr_name属性:表示属性的名称,其类型为字符串(String)。 + // 用于存储属性的描述性名称。 + attr_name: String, + + // cat_id属性:表示分类ID,其类型为数字(Number)。 + // 这个属性用于将属性与特定的商品分类关联起来。 + cat_id: Number, + + // attr_sel属性:表示属性的选择类型,其值为一个数组,包含"only"和"many"。 + // "only"表示该属性为唯一选择(如输入框),"many"表示该属性可以从多个选项中选择(如下拉列表或单选框)。 + attr_sel: ["only", "many"], + + // attr_write属性:表示属性的写入方式,其值为一个数组,包含"manual"和"list"。 + // "manual"表示属性值需要手工录入,"list"表示属性值应从预定义的列表中选择。 + attr_write: ["manual", "list"], + + // attr_vals属性:表示属性的值,其类型为字符串(String)。 + // 存储属性的实际值,可能是一个逗号分隔的字符串(对于"many"类型的属性)。 + attr_vals: String, + + // delete_time属性:表示删除时间,其类型为数字(Number)。 + // 用于逻辑删除,即不真正从数据库中删除记录,而是通过设置一个删除时间来标记记录已删除。 + delete_time: Number + }, { + // 以下是该模型的选项或配置的定义部分: + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名被指定为"sp_attribute",这是数据库中存储属性信息的表的名称。 + table: "sp_attribute" + }); + + // 模型定义完成。现在,我们调用之前传入的回调函数callback。 + // 由于模型定义操作通常不会返回任何结果(除非出现错误),因此这里我们传入一个空参数。 + // 回调函数可以在此处执行一些后续的逻辑处理,如初始化数据、启动服务等。 + // 但在这个例子中,回调函数可能只是被用来简单地表示模型定义过程的结束。 + return callback(); } \ No newline at end of file diff --git a/models/CategoryModel.js b/models/CategoryModel.js index 6d72f8a..7d53ec6 100644 --- a/models/CategoryModel.js +++ b/models/CategoryModel.js @@ -1,13 +1,44 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("CategoryModel",{ - cat_id : {type: 'serial', key: true}, - cat_name : String, - cat_pid : Number, - cat_level : Number, - cat_deleted: Boolean - },{ - table : "sp_category" - }); - return callback(); +// 这是一个Node.js模块,它导出一个函数。这个函数用于定义一个数据库模型,并允许在模型定义完成后执行回调函数。 +module.exports = function(db, callback) { + // 开始定义用户模型(在这个上下文中,是分类模型)。 + // 函数接受一个数据库对象db和一个回调函数callback作为参数。 + // 使用db对象的define方法来定义一个名为CategoryModel的新模型。 + // 这个模型用于操作数据库中的分类信息,如创建、读取、更新和删除分类。 + db.define("CategoryModel", { + // 定义模型的第一个属性:分类ID(cat_id)。 + // 这是一个自增主键,意味着每当向数据库添加新分类时,这个ID都会自动递增。 + // type: 'serial'指定了这是一个序列类型(自增类型),key: true表示这是主键。 + cat_id: {type: 'serial', key: true}, + + // 定义模型的第二个属性:分类名称(cat_name)。 + // 这是一个字符串类型,用于存储分类的名称或标题。 + cat_name: String, + + // 定义模型的第三个属性:父分类ID(cat_pid)。 + // 这是一个数字类型,用于表示当前分类的上级分类(如果存在的话)。 + // 通过这个属性,可以建立分类之间的层级关系或父子关系。 + cat_pid: Number, + + // 定义模型的第四个属性:分类级别(cat_level)。 + // 这也是一个数字类型,用于表示分类在层级结构中的位置或深度。 + // 例如,顶级分类的级别可能是1,其子分类的级别可能是2,依此类推。 + cat_level: Number, + + // 定义模型的第五个属性:是否已删除(cat_deleted)。 + // 这是一个布尔值类型,用于标记该分类是否已被逻辑删除(即在数据库中保留但不再显示或使用)。 + // 这是一种软删除的方式,允许在不实际删除数据的情况下,从系统中移除分类。 + cat_deleted: Boolean + }, { + // 定义模型的选项或配置。 + // 在这个例子中,只定义了一个选项:table。 + // 这个选项指定了模型对应的数据库表名。 + // 在这个例子中,表名是"sp_category"。 + // 这意味着该模型的所有数据库操作(如查询、插入、更新和删除)都会针对这个表进行。 + table: "sp_category" + }); + + // 模型定义完成。现在调用回调函数callback,并传入空参数(或无参数)。 + // 这通常表示模型已经成功定义,可以进行后续操作(如查询数据库、添加数据等)。 + // 回调函数可以用于执行任何需要在模型定义完成后立即执行的操作。 + return callback(); } \ No newline at end of file diff --git a/models/GoodAttributeModel.js b/models/GoodAttributeModel.js index f9b722a..99b0354 100644 --- a/models/GoodAttributeModel.js +++ b/models/GoodAttributeModel.js @@ -1,13 +1,46 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("GoodAttributeModel",{ - id : {type: 'serial', key: true}, - goods_id : Number, - attr_id : Number, - attr_value : String, - add_price : Number - },{ - table : "sp_goods_attr" - }); - return callback(); +// 导出一个函数,这个函数接受两个参数: +// 第一个参数是数据库对象db,它提供了与数据库交互的API,用于执行数据库操作; +// 第二个参数是一个回调函数callback,它在模型定义完成后被调用,用于执行一些后续逻辑。 +module.exports = function(db, callback) { + // 使用db.define方法开始定义一个新的数据库模型。 + // 这个模型实际上是一个商品属性模型,用于存储商品的属性信息。 + // 模型的名称被指定为"GoodAttributeModel",这是在代码中引用该模型时使用的标识符。 + db.define("GoodAttributeModel", { + // 定义模型的第一个属性:id。 + // 这是一个自增的主键,用于唯一标识数据库中的每一条记录。 + // type: 'serial'指定了这是一个序列类型(自增类型),key: true表示这是主键。 + id: {type: 'serial', key: true}, + + // 定义模型的第二个属性:goods_id。 + // 这是一个数字类型的属性,用于存储关联的商品ID。 + // 通过这个属性,可以将商品属性与具体的商品记录关联起来。 + goods_id: Number, + + // 定义模型的第三个属性:attr_id。 + // 这也是一个数字类型的属性,用于存储关联的属性ID。 + // 通过这个属性,可以将商品属性与具体的属性记录关联起来,表示这个商品属性是哪种属性。 + attr_id: Number, + + // 定义模型的第四个属性:attr_value。 + // 这是一个字符串类型的属性,用于存储商品属性的具体值。 + // 例如,如果属性是颜色,那么attr_value就可能是"红色"、"蓝色"等。 + attr_value: String, + + // 定义模型的第五个属性:add_price。 + // 这是一个数字类型的属性,用于存储由于这个属性而导致的附加价格。 + // 如果某个属性会导致商品价格变动(如不同颜色价格不同),则在这里存储增加的金额。 + add_price: Number + }, { + // 定义模型的选项或配置。 + // 在这个例子中,只定义了一个选项:table。 + // table选项指定了模型在数据库中对应的表名。 + // 在这个例子中,表名被指定为"sp_goods_attr",这是数据库中存储商品属性信息的表的名称。 + table: "sp_goods_attr" + }); + + // 模型定义完成。现在,我们调用回调函数callback。 + // 由于我们没有向回调函数传递任何参数,这通常表示模型定义成功,没有发生错误。 + // 回调函数可以在这里执行一些后续操作,如初始化数据、启动服务等。 + // 在这个例子中,回调函数被简单地调用,没有执行任何额外的逻辑。 + return callback(); } \ No newline at end of file diff --git a/models/GoodModel.js b/models/GoodModel.js index 5e3bbb1..3db0c81 100644 --- a/models/GoodModel.js +++ b/models/GoodModel.js @@ -1,33 +1,40 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("GoodModel",{ - goods_id : {type: 'serial', key: true}, - cat_id : Number, - goods_name : String, - goods_price : Number, - goods_number : Number, - goods_weight : Number, - goods_introduce : String, - goods_big_logo : String, - goods_small_logo : String, - goods_state : Number, // 0:未审核 1: 审核中 2: 已审核 - is_del : ['0','1'], // 0: 正常 , 1: 删除 - add_time : Number, - upd_time : Number, - delete_time : Number, - hot_mumber : Number, - is_promote : Boolean, - cat_one_id : Number, - cat_two_id : Number, - cat_three_id : Number - - },{ - table : "sp_goods", - methods: { - getGoodsCat: function () { - return this.cat_one_id + ',' + this.cat_two_id + ',' + this.cat_three_id; - } - } - }); - return callback(); +// 导出一个函数,这个函数接受两个参数: +// 第一个参数是数据库对象db,用于数据库操作; +// 第二个参数是一个回调函数callback,用于在操作完成后执行特定逻辑。 +module.exports = function(db, callback) { + // 开始定义用户模型,这里的用户模型实际上是一个商品属性模型。 + // 使用db.define方法,该方法用于在数据库中定义一个新的模型(或称为表结构)。 + // 模型名为GoodAttributeModel,代表商品属性模型。 + db.define("GoodAttributeModel", { + // 以下是模型属性的定义: + // id属性:作为主键,其类型为'serial',表示这是一个自增的序列号。 + // key: true表示这个属性是主键。 + id: {type: 'serial', key: true}, + + // goods_id属性:表示商品ID,其类型为数字(Number)。 + // 用于关联到具体的商品记录。 + goods_id: Number, + + // attr_id属性:表示属性ID,其类型为数字(Number)。 + // 用于关联到具体的属性记录,表示这个商品属性是哪种属性。 + attr_id: Number, + + // attr_value属性:表示属性值,其类型为字符串(String)。 + // 存储商品该属性的具体值,如颜色为红色、尺码为L等。 + attr_value: String, + + // add_price属性:表示附加价格,其类型为数字(Number)。 + // 如果某个属性会导致商品价格变动(如不同颜色价格不同),则在这里存储增加的金额。 + add_price: Number + }, { + // 以下是模型选项的定义: + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名为sp_goods_attr,表示商品属性表。 + table: "sp_goods_attr" + }); + + // 模型定义完成,调用回调函数callback。 + // 传入无参数,表示模型定义成功,可以进行后续操作。 + // 回调函数通常用于执行一些后续的逻辑处理,如初始化数据、启动服务等。 + return callback(); } \ No newline at end of file diff --git a/models/GoodPicModel.js b/models/GoodPicModel.js index daa709b..ee3e98d 100644 --- a/models/GoodPicModel.js +++ b/models/GoodPicModel.js @@ -1,13 +1,44 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("GoodPicModel",{ - pics_id : {type: 'serial', key: true}, - goods_id : Number, - pics_big : String, - pics_mid : String, - pics_sma : String - },{ - table : "sp_goods_pics" - }); - return callback(); +// 导出一个函数,这个函数是模块的主要接口,它接受两个参数: +// 第一个参数是数据库对象db,它封装了与数据库进行交互的所有能力; +// 第二个参数是一个回调函数callback,它将在模型定义成功完成后被调用。 +module.exports = function(db, callback) { + // 使用db.define方法开始定义一个新的数据库模型。 + // 需要注意的是,虽然这里提到的是“用户模型”,但实际上定义的是一个商品图片模型。 + // 模型的名称被指定为"GoodPicModel",这是在代码中引用该模型时的标识符。 + db.define("GoodPicModel", { + // 以下是该模型属性的定义,每个属性都对应数据库表中的一个字段: + + // pics_id属性:这是模型的主键,类型为'serial',表示这是一个自增的序列号。 + // key: true表明这个属性是主键,用于唯一标识数据库中的每一条记录。 + pics_id: {type: 'serial', key: true}, + + // goods_id属性:表示关联的商品ID,类型为Number。 + // 这个属性用于将商品图片与其对应的商品记录关联起来。 + goods_id: Number, + + // pics_big属性:表示商品的大图地址,类型为String。 + // 存储商品大图的URL链接,用于在需要高清图片展示时使用。 + pics_big: String, + + // pics_mid属性:表示商品的中图地址,类型为String。 + // 存储商品中图的URL链接,用于在需要中等尺寸图片展示时使用。 + pics_mid: String, + + // pics_sma属性:表示商品的小图地址,类型为String。 + // 存储商品小图的URL链接,通常用于商品列表或缩略图展示场景。 + pics_sma: String + }, { + // 以下是该模型的选项或配置的定义部分: + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名被指定为"sp_goods_pics",这是数据库中存储商品图片信息的表的名称。 + // 所有与GoodPicModel相关的数据库操作都会针对这个表进行。 + table: "sp_goods_pics" + }); + + // 模型定义完成。现在,我们调用之前传入的回调函数callback。 + // 由于模型定义操作通常不会返回任何结果(除非出现错误),因此这里我们传入一个空参数。 + // 回调函数可以在此处执行一些后续的逻辑处理,如初始化数据、启动服务等。 + // 但在这个例子中,回调函数可能只是被用来简单地表示模型定义过程的结束,或者进行一些简单的日志记录。 + return callback(); } \ No newline at end of file diff --git a/models/ManagerModel.js b/models/ManagerModel.js index 6267937..63461b8 100644 --- a/models/ManagerModel.js +++ b/models/ManagerModel.js @@ -1,16 +1,55 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("ManagerModel",{ - mg_id : {type: 'serial', key: true}, - mg_name : String, - mg_pwd : String, - mg_time : Number, - role_id : Number, - mg_mobile : String, - mg_email : String, - mg_state : Number - },{ - table : "sp_manager" - }); - return callback(); +// 导出一个函数,这个函数有两个参数: +// 第一个参数是数据库对象db,用于执行数据库相关操作; +// 第二个参数是一个回调函数callback,用于在模型定义完成后执行一些后续操作。 +module.exports = function(db, callback) { + // 注释:以下代码定义了一个用户模型,但根据上下文,这里更准确地应该是一个管理员模型。 + // 使用数据库对象db的define方法,定义一个名为ManagerModel的模型。 + // 这个模型用于表示系统中的管理员信息。 + db.define("ManagerModel", { + // 以下是ManagerModel模型的属性定义: + + // mg_id属性:表示管理员的唯一标识符,类型为'serial',表示这是一个自增的主键。 + // key: true表示这个属性是主键,用于唯一标识数据库中的每条记录。 + mg_id: {type: 'serial', key: true}, + + // mg_name属性:表示管理员的名称,类型为字符串(String)。 + // 用于存储管理员的登录名或姓名。 + mg_name: String, + + // mg_pwd属性:表示管理员的密码,类型为字符串(String)。 + // 用于存储管理员的登录密码,通常经过加密处理。 + mg_pwd: String, + + // mg_time属性:表示与管理员相关的时间信息,类型为数字(Number)。 + // 这个时间可能是管理员的注册时间、最后登录时间或其他与时间相关的属性。 + mg_time: Number, + + // role_id属性:表示管理员的角色ID,类型为数字(Number)。 + // 用于关联管理员与其在系统中的角色,从而控制管理员的权限。 + role_id: Number, + + // mg_mobile属性:表示管理员的手机号码,类型为字符串(String)。 + // 用于存储管理员的联系电话,便于在需要时联系管理员。 + mg_mobile: String, + + // mg_email属性:表示管理员的邮箱地址,类型为字符串(String)。 + // 用于存储管理员的电子邮件地址,便于发送通知或重置密码等操作。 + mg_email: String, + + // mg_state属性:表示管理员的状态,类型为数字(Number)。 + // 这个状态可能表示管理员是否激活、是否禁用或其他与管理员状态相关的属性。 + mg_state: Number + }, { + // 以下是ManagerModel模型的选项定义: + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名为sp_manager,表示这个模型对应的数据库表是sp_manager。 + table: "sp_manager" + }); + + // 模型定义完成,现在调用回调函数callback。 + // 由于模型定义通常不会返回任何结果(除非出错),因此这里传入无参数。 + // 回调函数可以在此处执行一些后续的逻辑处理,如初始化数据、启动服务等。 + // 但在这个例子中,回调函数可能只是简单地表示模型定义过程的结束。 + return callback(); } \ No newline at end of file diff --git a/models/OrderGoodModel.js b/models/OrderGoodModel.js index 27e71b4..57ee76c 100644 --- a/models/OrderGoodModel.js +++ b/models/OrderGoodModel.js @@ -1,14 +1,48 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("OrderGoodModel",{ - id : {type: 'serial', key: true}, - order_id : Number, - goods_id : Number, - goods_price : Number, - goods_number : Number, - goods_total_price : Number - },{ - table : "sp_order_goods" - }); - return callback(); +// 导出一个函数,这个函数接受两个参数: +// 第一个参数是数据库对象db,它提供了与数据库进行交互的API; +// 第二个参数是一个回调函数callback,它在模型定义完成后被调用。 +module.exports = function(db, callback) { + // 注释:以下代码定义了一个模型,用于表示订单中的商品信息。 + // 使用数据库对象db的define方法,定义一个名为OrderGoodModel的模型。 + // 这个模型将用于存储订单中每个商品的相关信息。 + db.define("OrderGoodModel", { + // 以下是OrderGoodModel模型的属性定义部分: + + // id属性:表示订单商品的唯一标识符,类型为'serial',表示这是一个自增的主键。 + // key: true表示这个属性是主键,用于唯一标识数据库中的每条记录。 + id: {type: 'serial', key: true}, + + // order_id属性:表示这个订单商品所属的订单ID,类型为数字(Number)。 + // 用于关联订单商品与其所属的订单记录。 + order_id: Number, + + // goods_id属性:表示这个订单商品对应的商品ID,类型为数字(Number)。 + // 用于关联订单商品与其对应的商品记录。 + goods_id: Number, + + // goods_price属性:表示这个订单商品的价格,类型为数字(Number)。 + // 存储商品在订单中的单价,可能包含折扣或优惠后的价格。 + goods_price: Number, + + // goods_number属性:表示这个订单商品的数量,类型为数字(Number)。 + // 存储用户购买的商品数量。 + goods_number: Number, + + // goods_total_price属性:表示这个订单商品的总价,类型为数字(Number)。 + // 存储商品单价乘以数量的结果,即用户需要支付的总金额(对于该商品)。 + goods_total_price: Number + }, { + // 以下是OrderGoodModel模型的选项定义部分: + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名为sp_order_goods,表示这个模型对应的数据库表是sp_order_goods。 + // 所有与OrderGoodModel相关的数据库操作都会针对这个表进行。 + table: "sp_order_goods" + }); + + // 模型定义完成,现在调用回调函数callback。 + // 由于模型定义通常不会返回任何结果(除非出错),因此这里传入无参数。 + // 回调函数可以在此处执行一些后续的逻辑处理,如初始化数据、启动服务等。 + // 但在这个例子中,回调函数可能只是简单地表示模型定义过程的结束,或者用于通知调用者模型已经准备好。 + return callback(); } \ No newline at end of file diff --git a/models/OrderModel.js b/models/OrderModel.js index af518ee..5065d3a 100644 --- a/models/OrderModel.js +++ b/models/OrderModel.js @@ -1,22 +1,27 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("OrderModel",{ - order_id : {type: 'serial', key: true}, - user_id : Number, - order_number : String, - order_price : Number, - order_pay : [1,2,3], - is_send : ["是","否"], - trade_no : String, - order_fapiao_title : ["个人","公司"], - order_fapiao_company : String, - order_fapiao_content : String, - consignee_addr : String, - pay_status : ['0','1'], - create_time : Number, - update_time : Number - },{ - table : "sp_order" - }); - return callback(); +// 导出一个函数,这个函数接受数据库对象db和一个回调函数callback作为参数 +module.exports = function(db, callback) { + // 用户模型 + // 使用db.define方法定义一个模型,模型名为OrderModel + db.define("OrderModel", { + // 定义模型的属性 + order_id: {type: 'serial', key: true}, // 订单ID,自增主键,用于唯一标识每一个订单 + user_id: Number, // 用户ID,类型为数字,表示下单用户的唯一标识 + order_number: String, // 订单编号,类型为字符串,用于内部跟踪或用户查询 + order_price: Number, // 订单总价,类型为数字,表示订单的总金额 + order_pay: [1,2,3], // 订单支付方式,类型为数字数组,具体值可能代表不同的支付方式(如1代表支付宝,2代表微信支付等) + is_send: ["是","否"], // 是否发货,类型为字符串数组,表示订单是否已经发货 + trade_no: String, // 交易编号,类型为字符串,用于第三方支付平台的交易记录 + order_fapiao_title: ["个人","公司"], // 发票抬头,类型为字符串数组,表示发票的抬头信息 + order_fapiao_company: String, // 发票公司名称,类型为字符串,当发票抬头为公司时需要填写 + order_fapiao_content: String, // 发票内容,类型为字符串,表示发票的具体内容 + consignee_addr: String, // 收货人地址,类型为字符串,表示订单的收货地址 + pay_status: ['0','1'], // 支付状态,类型为字符串数组,表示订单的支付状态(如0代表未支付,1代表已支付) + create_time: Number, // 创建时间,类型为数字,表示订单创建的时间戳 + update_time: Number // 更新时间,类型为数字,表示订单最后一次更新的时间戳 + }, { + // 定义模型的选项 + table: "sp_order" // 指定模型对应的数据库表名为sp_order,用于在数据库中存储订单信息 + }); + // 调用回调函数,传入无参数,表示模型定义完成 + return callback(); } \ No newline at end of file diff --git a/models/PermissionAPIModel.js b/models/PermissionAPIModel.js index 229bfbb..fec75f8 100644 --- a/models/PermissionAPIModel.js +++ b/models/PermissionAPIModel.js @@ -1,14 +1,24 @@ -module.exports = function(db,callback) { - // 用户模型 - db.define("PermissionAPIModel",{ - id : {type: 'serial', key: true}, - ps_id : Number, - ps_api_service : String, - ps_api_action : String, - ps_api_order : Number - - },{ - table : "sp_permission_api" - }); - return callback(); +// 导出一个函数,这个函数接受数据库对象db和一个回调函数callback作为参数 +module.exports = function(db, callback) { + // 用户模型 + // 使用db.define方法定义一个模型,模型名为PermissionAPIModel + db.define("PermissionAPIModel", { + // 定义模型的属性 + id: {type: 'serial', key: true}, +// 唯一标识ID,自增主键 + ps_id: Number, +// 权限ID,类型为数字 + ps_api_service: String, +// API服务名称,类型为字符串 + ps_api_action: String, +// API动作名称,类型为字符串 + ps_api_order: Number +// API顺序,类型为数字 + }, { + // 定义模型的选项 + table: "sp_permission_api" +// 指定模型对应的数据库表名为sp_permission_api + }); + // 调用回调函数,传入无参数 + return callback(); } \ No newline at end of file diff --git a/models/PermissionModel.js b/models/PermissionModel.js index b43fca5..b5515f0 100644 --- a/models/PermissionModel.js +++ b/models/PermissionModel.js @@ -1,14 +1,52 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("PermissionModel",{ - ps_id : {type: 'serial', key: true}, - ps_name : String, - ps_pid : Number, - ps_c : String, - ps_a : String, - ps_level : String - },{ - table : "sp_permission" - }); - return callback(); +// 导出一个函数,该函数是模块的主要接口。 +// 它接受两个参数:数据库对象db(用于数据库操作)和一个回调函数callback(在模型定义后执行)。 +module.exports = function(db, callback) { + // 定义一个名为"PermissionModel"的模型,用于表示系统中的权限。 + // 使用db.define方法,该方法来自传入的数据库对象db。 + db.define("PermissionModel", { + // 定义模型的属性,这些属性将映射到数据库表中的列。 + + // ps_id属性:权限的唯一标识符,类型为'serial',表示这是一个自增的序列。 + // key: true表明这个属性是主键。 + ps_id: {type: 'serial', key: true}, + // 注释:权限ID,自增主键,用于唯一标识每个权限记录。 + + // ps_name属性:权限的名称,类型为字符串(String)。 + // 用于存储权限的描述性名称。 + ps_name: String, + // 注释:权限名称,类型为字符串,用于标识和描述权限。 + + // ps_pid属性:父权限的ID,类型为数字(Number)。 + // 用于表示权限之间的层级关系,即哪个权限是另一个权限的父级。 + ps_pid: Number, + // 注释:父权限ID,类型为数字,用于建立权限的层级结构。 + + // ps_c属性:控制器名称,类型为字符串(String)。 + // 在MVC架构中,控制器负责处理用户的请求。 + // 这个属性可能用于指示哪个控制器与这个权限相关联。 + ps_c: String, + // 注释:控制器名称,类型为字符串,用于指示处理请求的控制器。 + + // ps_a属性:动作名称,类型为字符串(String)。 + // 在MVC架构中,动作是控制器中的一个方法,用于执行特定的任务。 + // 这个属性可能用于指示哪个动作与这个权限相关联。 + ps_a: String, + // 注释:动作名称,类型为字符串,用于指示控制器中要执行的动作。 + + // ps_level属性:权限级别,类型为字符串(String)。 + // 这个属性可能用于表示权限的重要性或访问级别。 + ps_level: String + // 注释:权限级别,类型为字符串,用于表示权限的等级或重要性。 + }, { + // 定义模型的选项,这些选项用于配置模型的行为或属性。 + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名被指定为"sp_permission"。 + table: "sp_permission" + // 注释:指定模型对应的数据库表名为sp_permission,这是存储权限信息的数据库表。 + }); + + // 调用回调函数callback,表示模型定义已经完成。 + // 回调函数不接受任何参数,因为它主要用于执行一些后续的逻辑处理,而不是处理模型定义的结果。 + return callback(); } \ No newline at end of file diff --git a/models/ReportOneModel.js b/models/ReportOneModel.js index 276768c..aa3c59f 100644 --- a/models/ReportOneModel.js +++ b/models/ReportOneModel.js @@ -1,12 +1,22 @@ -module.exports = function(db,callback){ - // 报表模型1 - db.define("ReportOneModel",{ - id : {type: 'serial', key: true}, - rp1_user_count : Number, - rp1_area : Number, - rp1_date : { type: "date", time: false } - },{ - table : "sp_report_1" - }); - return callback(); +// 导出一个函数,这个函数接受数据库对象db和一个回调函数callback作为参数 +module.exports = function(db, callback) { + // 报表模型1 + // 使用db.define方法定义一个模型,模型名为ReportOneModel + db.define("ReportOneModel", { + // 定义模型的属性 + id: {type: 'serial', key: true}, + // 唯一标识ID,自增主键 + rp1_user_count: Number, + // 用户数量,类型为数字 + rp1_area: Number, +// 区域代码或标识,类型为数字 + rp1_date: { type: "date", time: false } +// 报表日期,类型为日期,不包含时间信息 + }, { + // 定义模型的选项 + table: "sp_report_1" +// 指定模型对应的数据库表名为sp_report_1 + }); + // 调用回调函数,传入无参数 + return callback(); } \ No newline at end of file diff --git a/models/ReportTwoModel.js b/models/ReportTwoModel.js index 0a0c31a..8cf4e96 100644 --- a/models/ReportTwoModel.js +++ b/models/ReportTwoModel.js @@ -1,12 +1,51 @@ -module.exports = function(db,callback){ - // 报表模型1 - db.define("ReportTwoModel",{ - id : {type: 'serial', key: true}, - rp2_page : String, - rp2_count : Number, - rp2_date : { type: "date", time: false } - },{ - table : "sp_report_2" - }); - return callback(); +// 导出一个函数,这个函数是模块的主要接口。 +// 它接受两个参数:数据库对象db(用于数据库操作)和一个回调函数callback(在模型定义后执行)。 +module.exports = function(db, callback) { + + // 这一行开始定义了一个名为"ReportTwoModel"的模型。 + // db.define是数据库操作的一部分,用于创建一个新的模型。 + // 这个模型可能用于存储报表数据,特别是与页面相关的统计数据。 + db.define("ReportTwoModel", { + + // 以下是模型属性的定义部分。 + // 每个属性都映射到数据库表中的一个列。 + + // id属性:这是模型的主键,用于唯一标识每条记录。 + // type: 'serial' 表示这是一个自增的整数序列。 + // key: true 表示这是主键字段。 + id: {type: 'serial', key: true}, + // 注释:这是报表记录的唯一标识ID,它是一个自增的主键。 + + // rp2_page属性:用于存储与报表关联的页面名称。 + // 类型为String,表示这是一个字符串类型的字段。 + rp2_page: String, + // 注释:这是报表关联的页面名称,它是一个字符串类型的字段。 + + // rp2_count属性:用于存储与页面相关的统计数据,如访问次数。 + // 类型为Number,表示这是一个数字类型的字段。 + rp2_count: Number, + // 注释:这是与报表页面相关的统计数据,如访问次数,它是一个数字类型的字段。 + + // rp2_date属性:用于存储报表的生成日期。 + // 类型为"date",并且time: false表示只存储日期部分,不存储时间部分。 + rp2_date: { type: "date", time: false } + // 注释:这是报表的生成日期,只包含日期部分,不包含时间部分,它是一个日期类型的字段。 + + }, { + + // 以下是模型选项的定义部分。 + // 这些选项用于配置模型的行为或属性。 + + // table选项:指定这个模型在数据库中对应的表名。 + // 在这个例子中,表名被指定为"sp_report_2"。 + table: "sp_report_2" + // 注释:这是模型对应的数据库表名,存储报表相关数据的表名为sp_report_2。 + + }); + + // 这一行调用了回调函数callback。 + // 回调函数是在模型定义完成后执行的,它不接受任何参数。 + // 在这个例子中,回调函数的调用表示ReportTwoModel模型已经成功定义。 + // 这之后,模型就可以在应用程序的其他部分被引用和使用了。 + return callback(); } \ No newline at end of file diff --git a/models/RoleModel.js b/models/RoleModel.js index 1f62f5f..d112aa9 100644 --- a/models/RoleModel.js +++ b/models/RoleModel.js @@ -1,13 +1,24 @@ -module.exports = function(db,callback){ - // 用户模型 - db.define("RoleModel",{ - role_id : {type: 'serial', key: true}, - role_name : String, - ps_ids : String, - ps_ca : String, - role_desc : String - },{ - table : "sp_role" - }); - return callback(); +// 导出一个函数,这个函数接受数据库对象db和一个回调函数callback作为参数 +module.exports = function(db, callback) { + // 用户模型 + // 使用db.define方法定义一个模型,模型名为RoleModel + db.define("RoleModel", { + // 定义模型的属性 + role_id: {type: 'serial', key: true}, +// 角色ID,自增主键 + role_name: String, +// 角色名称,类型为字符串 + ps_ids: String, +// 权限ID列表,类型为字符串,可能以某种方式(如逗号分隔)存储多个权限ID + ps_ca: String, +// 权限字符串,类型为字符串,可能表示权限的字符串表示形式 + role_desc: String +// 角色描述,类型为字符串 + }, { + // 定义模型的选项 + table: "sp_role" +// 指定模型对应的数据库表名为sp_role + }); + // 调用回调函数,传入无参数 + return callback(); } \ No newline at end of file diff --git a/modules/Logistics.js b/modules/Logistics.js index 5fb82e3..534bb6e 100644 --- a/modules/Logistics.js +++ b/modules/Logistics.js @@ -1,54 +1,68 @@ -// 导入 request 模块 -const request = require('request') +// 导入 request 模块,该模块常用于在 Node.js 中发起 HTTP 请求,方便与其他网络服务进行交互 +const request = require('request'); // 自动匹配运单号所属的物流公司 function autoComNumber(orderno) { - const url = `https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=${orderno}` - return new Promise(function(resolve, reject) { - request(url, (err, response, body) => { - if (err) return reject({ status: 500, msg: err.message }) - // resolve(body) - // console.log(body.num) - body = JSON.parse(body) - if (body.auto.length <= 0) return reject({ status: 501, msg: '无对应的物流公司' }) - resolve({ status: 200, msg: body.auto[0], comCode: body.auto[0].comCode }) - }) - }) + // 构造请求的 URL,向快递100的接口发送请求,尝试自动匹配运单号对应的物流公司 + // 将运单号拼接到 URL 参数中,resultv2=1 可能是用于指定返回结果的某种格式或版本相关参数 + const url = `https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=${orderno}`; + // 返回一个 Promise 对象,用于处理异步操作,使得外部可以使用 async/await 语法来等待该函数执行完成 + return new Promise(function (resolve, reject) { + // 使用 request 模块发起 GET 请求,传入 URL 和回调函数,回调函数接收请求过程中的错误、响应对象以及响应体内容作为参数 + request(url, (err, response, body) => { + // 如果请求过程中出现错误,调用 reject 函数拒绝这个 Promise,并返回包含状态码 500 和错误信息的对象 + if (err) return reject({ status: 500, msg: err.message }); + // 将响应体内容(通常是 JSON 字符串格式)解析为 JavaScript 对象,方便后续提取数据 + body = JSON.parse(body); + // 如果解析后的 body.auto 数组长度小于等于 0,意味着没有匹配到对应的物流公司,同样调用 reject 函数拒绝 Promise,并返回相应的错误信息对象 + if (body.auto.length <= 0) return reject({ status: 501, msg: '无对应的物流公司' }); + // 如果匹配到了物流公司,调用 resolve 函数成功解决这个 Promise,返回包含状态码 200、物流公司信息以及对应的公司编码的对象 + resolve({ status: 200, msg: body.auto[0], comCode: body.auto[0].comCode }); + }); + }); } +// 定义一个异步函数,用于获取物流信息,接收 Express 框架的请求(req)和响应(res)对象作为参数(从函数名和使用方式推测可能在 Express 应用中使用) async function getLogisticsInfo(req, res) { - const result = await autoComNumber(req.params.orderno) + // 调用 autoComNumber 函数,传入请求参数中的运单号(req.params.orderno),并使用 await 等待该异步操作完成,获取匹配物流公司后的结果 + const result = await autoComNumber(req.params.orderno); - if (result.status !== 200) { - return { - meta: { - status: 500, - message: '获取物流信息失败!' - } + // 如果返回结果的状态码不是 200,说明匹配物流公司出现问题,直接返回一个包含错误状态和相应错误消息的对象给客户端 + if (result.status!== 200) { + return { + meta: { + status: 500, + message: '获取物流信息失败!' + } + }; } - } - const dataUrl = `https://www.kuaidi100.com/query?type=${result.comCode}&postid=${req.params.orderno}&temp=0.2595247267684455` - request(dataUrl, (err, response, body) => { - if (err) { - return res.send({ - meta: { - status: 501, - message: '获取物流信息失败!' + // 根据匹配到的物流公司编码和运单号构造查询物流信息的 URL,向快递100的另一个接口发送请求以获取详细物流信息 + const dataUrl = `https://www.kuaidi100.com/query?type=${result.comCode}&postid=${req.params.orderno}&temp=0.2595247267684455`; + // 使用 request 模块发起请求,传入构造好的 URL 和回调函数,处理获取物流信息过程中的各种情况 + request(dataUrl, (err, response, body) => { + // 如果请求过程中出现错误,使用 Express 的 res.send 方法向客户端发送包含错误状态和相应错误消息的对象,表示获取物流信息失败 + if (err) { + return res.send({ + meta: { + status: 501, + message: '获取物流信息失败!' + } + }); } - }) - } - // 获取物流信息成功 - return res.send({ - meta: { - status: 200, - message: '获取物流信息成功!' - }, - data: (JSON.parse(body)).data - }) - }) + // 如果请求成功,解析响应体内容(假设为 JSON 格式),提取其中的物流信息数据(.data 属性,具体格式取决于快递100接口返回的数据结构), + // 然后使用 Express 的 res.send 方法向客户端发送包含成功状态、相应消息以及物流信息数据的对象,表示获取物流信息成功 + return res.send({ + meta: { + status: 200, + message: '获取物流信息成功!' + }, + data: (JSON.parse(body)).data + }); + }); } +// 将 getLogisticsInfo 函数作为模块的属性导出,方便其他模块引入并使用这个函数来获取物流信息 module.exports = { - getLogisticsInfo -} + getLogisticsInfo +}; \ No newline at end of file diff --git a/modules/authorization.js b/modules/authorization.js index 7142ec4..82ada1f 100644 --- a/modules/authorization.js +++ b/modules/authorization.js @@ -1,74 +1,91 @@ +// 引入Node.js的path模块,用于处理文件路径相关操作 var path = require('path'); +// 原本要引入的roles控制器模块,此处被注释掉了,可能后续会按需启用 // var roles_controller = require("../controllers/roles"); +// 再次引入path模块,前面的引入语句重复了,但在Node.js中不会有实质影响,可考虑优化掉重复引入的情况 var path = require("path"); +// 创建一个全局对象service_caches,用于缓存服务相关的模块或数据,初始为空对象 global.service_caches = {}; -// 存储全局验证函数 +// 创建一个全局变量service_auth_fn,用于存储全局验证函数,初始值为null global.service_auth_fn = null; /** - * 构造回调对象格式 + * Invocation函数用于构造一个回调对象格式,主要用于在调用服务的具体方法时进行权限验证等相关操作。 * - * @param {[type]} serviceName 服务名称 - * @param {[type]} actionName 动作名称(方法名) - * @param {[type]} serviceModule 服务模块 - * @param {[type]} origFunc 原始方法 + * @param {[type]} serviceName 服务名称,用于标识具体是哪个服务。 + * @param {[type]} actionName 动作名称(方法名),对应服务模块里具体的函数名称。 + * @param {[type]} serviceModule 服务模块,即通过require加载进来的包含具体业务逻辑函数的模块对象。 + * @param {[type]} origFunc 原始方法,也就是服务模块里未经包装的原始业务逻辑函数。 */ -function Invocation(serviceName,actionName,serviceModule,origFunc) { - return function() { - var origArguments = arguments; - return function(req,res,next) { - if(global.service_auth_fn) { - global.service_auth_fn(req,res,next,serviceName,actionName,function(pass) { - if(pass) { - origFunc.apply(serviceModule,origArguments); - } else { - res.sendResult(null,401,"权限验证失败"); - } - }); - } else { - res.sendResult(null,401,"权限验证失败"); - } - } - } +function Invocation(serviceName, actionName, serviceModule, origFunc) { + // 返回一个新的函数,这个函数会接收一些参数(此处未在形参中体现,在调用时会传入),并返回另一个函数作为真正的回调函数 + return function () { + var origArguments = arguments; + return function (req, res, next) { + // 判断全局验证函数是否存在,如果存在则进行权限验证流程 + if (global.service_auth_fn) { + global.service_auth_fn(req, res, next, serviceName, actionName, function (pass) { + // 如果权限验证通过(pass为true),则执行原始的业务逻辑函数 + if (pass) { + origFunc.apply(serviceModule, origArguments); + } else { + // 如果权限验证失败,向客户端返回相应的错误信息,状态码为401表示未授权 + res.sendResult(null, 401, "权限验证失败"); + } + }); + } else { + // 如果全局验证函数不存在,直接返回权限验证失败的错误信息给客户端 + res.sendResult(null, 401, "权限验证失败"); + } + } + } } -// 获取服务对象 -module.exports.getService = function(serviceName) { +// 定义一个函数用于获取服务对象,它是模块对外暴露的接口之一 +module.exports.getService = function (serviceName) { + // 先检查全局缓存中是否已经存在指定名称的服务对象,如果存在则直接返回缓存中的服务对象 + if (global.service_caches[serviceName]) { + return global.service_caches[serviceName]; + } - if(global.service_caches[serviceName]) { - return global.service_caches[serviceName]; - } + // 构建服务模块的文件路径,通过拼接当前工作目录、"services"文件夹以及服务名称来确定具体路径 + var servicePath = path.join(process.cwd(), "services", serviceName); - var servicePath = path.join(process.cwd(),"services",serviceName); - - var serviceModule = require(servicePath); - if(!serviceModule) { - console.log("模块没有被发现"); - return null; - } - global.service_caches[serviceName] = {}; + // 通过require加载对应的服务模块,如果模块不存在则返回null并在控制台打印提示信息 + var serviceModule = require(servicePath); + if (!serviceModule) { + console.log("模块没有被发现"); + return null; + } - console.log("*****************************************"); - console.log("拦截服务 => %s",serviceName); - console.log("*****************************************"); - for(actionName in serviceModule) { + // 在全局缓存对象中为当前服务名称创建一个空对象,用于后续存储该服务的具体方法相关的回调对象等信息 + global.service_caches[serviceName] = {}; - if(serviceModule && serviceModule[actionName] && typeof(serviceModule[actionName]) == "function") { - var origFunc = serviceModule[actionName]; - global.service_caches[serviceName][actionName] = Invocation(serviceName,actionName,serviceModule,origFunc); - console.log("action => %s",actionName); - } - } - // console.log(global.service_caches); - console.log("*****************************************\n"); - return global.service_caches[serviceName]; -} + // 打印一些提示信息,表明正在拦截指定名称的服务,方便调试和查看流程 + console.log("*****************************************"); + console.log("拦截服务 => %s", serviceName); + console.log("*****************************************"); -// 设置全局验证函数 -module.exports.setAuthFn = function(authFn) { - global.service_auth_fn = authFn; + // 遍历服务模块里的所有属性(通常是方法) + for (actionName in serviceModule) { + // 检查属性对应的是否是一个函数(即服务模块里有效的业务逻辑函数) + if (serviceModule && serviceModule[actionName] && typeof (serviceModule[actionName]) == "function") { + var origFunc = serviceModule[actionName]; + // 使用Invocation函数构造该方法对应的回调对象,并将其存储到全局缓存对象中对应的服务和方法名下 + global.service_caches[serviceName][actionName] = Invocation(serviceName, actionName, serviceModule, origFunc); + console.log("action => %s", actionName); + } + } + // 打印一些分割线和空行,用于在控制台输出中更清晰地区分不同服务的处理情况,此处注释掉了打印全局缓存对象的语句 + // console.log(global.service_caches); + console.log("*****************************************\n"); + return global.service_caches[serviceName]; } +// 定义一个函数用于设置全局验证函数,它也是模块对外暴露的接口,供外部传入具体的验证函数 +module.exports.setAuthFn = function (authFn) { + global.service_auth_fn = authFn; +} \ No newline at end of file diff --git a/modules/database.js b/modules/database.js index 7fd8a20..32988e9 100644 --- a/modules/database.js +++ b/modules/database.js @@ -1,77 +1,95 @@ +// 引入Node.js的mysql模块,用于与MySQL数据库进行交互(虽然此处只是引入,后续具体使用情况暂未明确体现) require('mysql'); +// 引入Node.js的文件系统模块fs,用于对文件进行读写等操作 var fs = require("fs"); +// 引入orm模块,可能用于对象关系映射(Object Relational Mapping)相关操作,方便在Node.js中操作数据库 var orm = require("orm"); +// 引入bluebird模块,用于提供更强大的Promise功能,便于处理异步操作 var Promise = require("bluebird"); +// 引入path模块,用于处理文件路径相关的操作 var path = require("path"); /* - app: 应用程序环境 - config: 数据库配置 - callback: 回调 -*/ -function initialize(app,callback) { + * initialize函数用于初始化数据库相关的配置以及加载ORM(对象关系映射)模型, + * 它接收应用程序环境对象、回调函数作为参数,通过一系列操作完成数据库连接和模型加载, + * 并在操作完成后通过回调函数返回相应结果。 + * + * @param {Object} app - 应用程序环境对象,通常包含了应用的一些全局配置和上下文信息,可用于挂载数据库实例、模型等相关对象。 + * @param {Function} callback - 回调函数,在数据库初始化及模型加载完成(成功或失败)后被调用,用于传递操作结果等信息。 + */ +function initialize(app, callback) { + // 加载配置文件,通过config模块(这里应该是自定义的配置管理模块)获取名为"db_config"的配置信息 + var config = require('config').get("db_config"); - // 加载配置文件 - var config = require('config').get("db_config"); - - // 从配置中获取数据库配置 - var opts = { - protocol : config.get("protocol"), - host : config.get("host"), - database : config.get("database"), - port : config.get("port"), - user : config.get("user"), - password : config.get("password"), - query : {pool: true,debug: true} - }; + // 从配置信息中提取数据库相关的配置参数,构建一个包含协议、主机、数据库名称、端口、用户名、密码以及查询相关配置(启用连接池、开启调试模式)的对象opts + var opts = { + protocol: config.get("protocol"), + host: config.get("host"), + database: config.get("database"), + port: config.get("port"), + user: config.get("user"), + password: config.get("password"), + query: { pool: true, debug: true } + }; - - console.log("数据库连接参数 %s",JSON.stringify(opts)); + // 在控制台打印数据库连接参数,将opts对象转换为JSON字符串格式输出,方便查看配置情况 + console.log("数据库连接参数 %s", JSON.stringify(opts)); - // 初始化ORM模型 - app.use(orm.express(opts, { - define: function (db, models, next) { + // 使用orm模块的express方法初始化ORM模型,将数据库配置参数opts以及一个包含define函数的对象作为参数传入 + app.use(orm.express(opts, { + define: function (db, models, next) { + // 将数据库实例db挂载到应用程序环境对象app上,方便在其他地方访问数据库实例 + app.db = db; + // 同时也将数据库实例挂载到全局对象global上,命名为database,不过使用全局变量需要谨慎,避免命名冲突等问题 + global.database = db; - app.db = db; - global.database = db; + // 获取映射文件的路径,通过拼接当前工作目录和"/models"来确定模型文件所在的文件夹路径 + var modelsPath = path.join(process.cwd(), "/models"); - // 获取映射文件路径 - var modelsPath = path.join(process.cwd(),"/models"); - - // 读取所有模型文件 - fs.readdir(modelsPath,function(err, files) { - // 存放所有的加载模型函数 - var loadModelAsynFns = new Array(); - // console.log("开始加载 ORM 模型层文件 "); - for (var i = 0; i < files.length; i++) { - var modelPath = modelsPath + "/" +files[i]; - // console.log("加载模型 %s",modelPath); - loadModelAsynFns[i] = db.loadAsync(modelPath); - } - - Promise.all(loadModelAsynFns) - .then(function(){ - // console.log("ORM 模型加载完成"); - // 挂载模型集合 + // 使用文件系统模块的readdir方法读取指定路径下的所有文件(即模型文件),读取完成后会调用回调函数处理结果 + fs.readdir(modelsPath, function (err, files) { + // 创建一个数组,用于存放所有加载模型的异步函数,每个元素对应一个模型文件的加载操作 + var loadModelAsynFns = new Array(); + // 以下循环遍历读取到的所有文件,准备加载每个模型文件对应的模型定义(通过db.loadAsync方法异步加载) + // console.log("开始加载 ORM 模型层文件 "); + for (var i = 0; i < files.length; i++) { + var modelPath = modelsPath + "/" + files[i]; + // console.log("加载模型 %s", modelPath); + // 将每个模型文件的异步加载函数存入数组中,后续会统一处理这些异步加载操作 + loadModelAsynFns[i] = db.loadAsync(modelPath); + } - for(var modelName in db.models){ - models[modelName] = db.models[modelName]; - } - app.models = models; - callback(null); - next(); - }) - .catch(function(error){ - console.error('加载模块出错 error: ' + err); - callback(error); - next(); - }); - }); - } - })); + // 使用Promise.all方法来并行处理所有模型文件的加载操作,当所有加载操作都成功完成后,执行then回调函数 + Promise.all(loadModelAsynFns) + .then(function () { + // console.log("ORM 模型加载完成"); + // 遍历数据库实例中已加载的所有模型,将每个模型挂载到models对象上,方便统一管理和访问 + for (var modelName in db.models) { + models[modelName] = db.models[modelName]; + } + // 将包含所有模型的models对象挂载到应用程序环境对象app上,方便在应用中使用模型进行数据库操作 + app.models = models; + // 调用传入的回调函数,传递null表示操作成功完成,无错误信息 + callback(null); + // 执行next函数,用于告知orm模块相关操作已完成,可继续后续流程(具体取决于orm模块的设计和使用方式) + next(); + }) + .catch(function (error) { + // 如果在加载模型过程中出现错误,在控制台打印错误信息,同时调用回调函数并传递错误对象,告知调用者操作失败 + console.error('加载模块出错 error: ' + err); + callback(error); + // 同样执行next函数,告知orm模块相关流程结束(即便出现错误) + next(); + }); + }); + } + })); } +// 将initialize函数作为模块的一个属性暴露出去,方便其他模块引入并调用该函数进行数据库初始化操作 module.exports.initialize = initialize; -module.exports.getDatabase = function() { - return global.database; + +// 定义一个函数用于获取全局的数据库实例对象,通过返回global对象上挂载的database属性(在initialize函数中进行挂载的)来实现 +module.exports.getDatabase = function () { + return global.database; } \ No newline at end of file diff --git a/modules/logger.js b/modules/logger.js index a811e85..fb0e1b4 100644 --- a/modules/logger.js +++ b/modules/logger.js @@ -1,20 +1,44 @@ +// 引入log4js模块,它是一个用于在Node.js应用中进行日志记录的常用库,能够方便地实现不同级别的日志输出以及日志的格式化、存储等功能 var log4js = require('log4js'); +// 使用log4js的configure方法进行日志配置,配置项以对象形式传入 log4js.configure({ - appenders: { cheese: { type: 'file', filename: 'cheese.log' } }, - categories: { default: { appenders: ['cheese'], level: 'error' } } + // 配置日志的输出目标(appenders),这里定义了一个名为'cheese'的输出配置 + appenders: { + // 'type'指定了输出类型为'file',即输出到文件 + // 'filename'指定了输出的文件名是'cheese.log',意味着日志信息将会被记录到该文件中 + cheese: { type: 'file', filename: 'cheese.log' } + }, + // 配置日志的分类(categories),用于将不同的日志记录器划分到不同的类别,并指定每个类别的相关属性 + categories: { + // 'default'表示默认的日志类别 + default: { + // 'appenders'数组指定了该类别使用的日志输出目标,这里只使用了前面定义的'cheese'输出目标 + appenders: ['cheese'], + // 'level'指定了该类别日志记录的级别,这里设置为'error',表示只有错误级别及以上的日志才会被记录到对应的输出目标中 + level: 'error' + } + } }); +// 将一个名为'logger'的函数作为模块的属性导出,用于获取日志记录器实例 exports.logger = function (level) { + // 通过log4js的getLogger方法获取名为'cheese'的日志记录器实例,后续可以使用这个实例来记录相应的日志信息 var logger = log4js.getLogger("cheese"); + // 设置该日志记录器的日志级别为'debug',这意味着从调试级别(最低级别)开始的所有日志都会被记录,覆盖了之前配置中'default'类别里设置的'error'级别(此处修改可能根据实际需求而定) logger.level = 'debug'; + // 返回配置好的日志记录器实例,外部模块可以调用该函数获取实例后进行日志记录操作 return logger; }; -// 配合 express 使用的方法 +// 以下是一段被注释掉的代码,从函数名和使用方式来看,它原本是用于配合Express框架使用的方法,用于在Express应用中集成log4js日志记录功能 // exports.use = function (app, level) { +// // 在Express应用中使用log4js的connectLogger中间件来记录请求相关的日志信息 +// // 首先通过log4js的getLogger方法获取名为'logInfo'的日志记录器实例(这里假设'logInfo'是之前定义好的某个日志记录器名称,实际可能需要准确配置) // app.use(log4js.connectLogger(log4js.getLogger('logInfo'), { +// // 设置日志记录的级别,它会尝试从传入的'level'参数获取对应级别,如果没有则使用默认的'debug'级别(这里的'levels'变量未在提供的代码中定义,可能是一个定义了不同日志级别映射关系的对象,实际应用中需要准确处理) // level: levels[level] || levels['debug'], +// // 定义日志记录的格式,这里使用了简单的格式字符串,指定记录请求的方法、URL以及响应状态等信息,方便后续查看请求相关的日志详情 // format: ':method :url :status' // })); // }; \ No newline at end of file diff --git a/modules/passport.js b/modules/passport.js index dfd4712..1f38ec8 100644 --- a/modules/passport.js +++ b/modules/passport.js @@ -1,86 +1,123 @@ +// 引入Passport模块,它是Node.js中用于处理用户认证的常用中间件,可方便地集成多种认证策略 const passport = require('passport'); +// 引入Passport的本地策略(LocalStrategy),通常用于基于用户名和密码的认证方式,比如常见的表单登录验证 const LocalStrategy = require('passport-local').Strategy; +// 引入Passport的HTTP Bearer策略(Strategy),常用于基于令牌(Token)的认证,比如JSON Web Tokens(JWT)认证场景 const Strategy = require('passport-http-bearer').Strategy; +// 引入jsonwebtoken模块,用于处理JSON Web Tokens(JWT)的生成、验证等操作 var jwt = require("jsonwebtoken"); - +// 引入Lodash库,它提供了很多实用的工具函数,用于处理数据、对象等,此处虽未明确体现具体使用的功能,但可能用于辅助数据操作等 var _ = require('lodash'); - +// 引入配置模块(config),并获取名为"jwt_config"的配置项,通常用于获取与JWT相关的配置信息,如密钥、过期时间等 var jwt_config = require("config").get("jwt_config"); // 通过登录函数初始化 /** - * 初始化 passport 框架 + * 初始化passport框架 + * 此函数的主要作用是配置Passport的不同认证策略,并将Passport初始化到给定的应用程序(app)中, + * 同时提供回调机制,方便在初始化完成后执行额外的操作。 * - * @param {[type]} app 全局应用程序 - * @param {[type]} loginFunc 登录函数 - * @param {Function} callback 回调函数 + * @param {[type]} app 全局应用程序,通常是Express等Web框架创建的应用实例,用于挂载中间件等操作。 + * @param {[type]} loginFunc 登录函数,用于执行具体的用户名和密码验证逻辑,比如查询数据库验证用户输入的用户名和密码是否匹配等操作。 + * @param {Function} callback 回调函数,在Passport初始化及相关策略配置完成后被调用,可用于执行后续自定义的初始化步骤等操作(可选参数)。 */ -module.exports.setup = function(app,loginFunc,callback) { - // 用户名密码 登录策略 - passport.use(new LocalStrategy( - function(username, password, done) { - if(!loginFunc) return done("登录验证函数未设置"); +module.exports.setup = function (app, loginFunc, callback) { + // 用户名密码 登录策略 + // 使用Passport的LocalStrategy配置基于用户名和密码的认证策略 + passport.use(new LocalStrategy( + // 定义验证逻辑函数,接收用户名、密码以及回调函数(done)作为参数 + function (username, password, done) { + // 如果没有传入登录验证函数(loginFunc),则直接通过回调函数(done)返回错误信息,表示登录验证函数未设置 + if (!loginFunc) return done("登录验证函数未设置"); - loginFunc(username,password,function(err,user) { - if(err) return done(err); - return done(null, user); - }); - }) - ); + // 调用传入的登录验证函数(loginFunc),传入用户名和密码进行验证,验证完成后会在回调函数中返回结果 + loginFunc(username, password, function (err, user) { + // 如果验证过程中出现错误,通过回调函数(done)返回错误信息给Passport,告知认证失败原因 + if (err) return done(err); + // 如果验证成功,通过回调函数(done)返回用户信息(通常是包含用户相关数据的对象)给Passport,表示认证成功 + return done(null, user); + }); + } + )); - // token 验证策略 - passport.use(new Strategy( - function(token, done) { - jwt.verify(token, jwt_config.get("secretKey"), function (err, decode) { - if (err) { return done("验证错误"); } - return done(null, decode); - }); - } - )); + // token验证策略 + // 使用Passport的HTTP Bearer策略配置基于令牌(Token)的认证策略 + passport.use(new Strategy( + // 定义验证逻辑函数,接收令牌(token)以及回调函数(done)作为参数 + function (token, done) { + // 使用jsonwebtoken模块的verify方法验证传入的令牌(token)是否有效, + // 传入令牌、配置中的密钥(jwt_config.get("secretKey"))以及验证回调函数,验证回调函数接收验证结果(err)和解析后的令牌数据(decode)作为参数 + jwt.verify(token, jwt_config.get("secretKey"), function (err, decode) { + // 如果验证过程中出现错误,通过回调函数(done)返回错误信息给Passport,表示令牌验证失败 + if (err) { return done("验证错误"); } + // 如果验证成功,通过回调函数(done)返回解析后的令牌数据(decode)给Passport,表示令牌验证通过 + return done(null, decode); + }); + } + )); - // 初始化passport模块 - app.use(passport.initialize()); + // 初始化passport模块 + // 将Passport中间件初始化到应用程序(app)中,使其能够在后续的请求处理流程中生效,用于处理各种认证相关的操作 + app.use(passport.initialize()); - if(callback) callback(); + // 如果传入了回调函数(callback),则执行该回调函数,用于在初始化完成后执行额外的自定义操作 + if (callback) callback(); }; /** * 登录验证逻辑 + * 此函数主要用于处理基于用户名和密码的登录请求验证逻辑,通过调用Passport的认证中间件进行验证, + * 根据验证结果生成相应的响应信息返回给客户端,包括在验证成功时生成并返回JWT令牌等操作。 * - * @param {[type]} req 请求 - * @param {[type]} res 响应 - * @param {Function} next [description] + * @param {[type]} req 请求对象,包含了客户端发送的请求相关信息,如请求头、请求体等内容,常用于获取用户名、密码等登录信息。 + * @param {[type]} res 响应对象,用于向客户端发送响应信息,如返回登录成功或失败的消息、生成的令牌等内容。 + * @param {Function} next 传递事件函数,用于将请求传递给下一个中间件继续处理(在Express等框架的中间件链机制中使用),此处未明确体现后续传递逻辑,但遵循中间件规范保留该参数。 */ -module.exports.login = function(req,res,next) { +module.exports.login = function (req, res, next) { + // 使用Passport的authenticate方法,传入'local'表示采用之前配置的基于用户名和密码的本地认证策略进行认证, + // 同时传入一个回调函数用于处理认证结果,该回调函数接收认证过程中的错误(err)、认证通过后的用户信息(user)以及额外的提示信息(info)作为参数 + passport.authenticate('local', function (err, user, info) { + // 如果认证过程中出现错误,使用响应对象(res)的sendResult方法(这里假设是自定义的用于统一返回响应格式的方法)向客户端发送包含错误状态码(400表示请求错误)和错误信息的响应 + if (err) return res.sendResult(null, 400, err); + // 如果没有获取到用户信息(即认证失败,未找到匹配的用户),同样使用响应对象的sendResult方法向客户端发送包含错误状态码和相应错误提示信息的响应 + if (!user) return res.sendResult(null, 400, "参数错误"); - passport.authenticate('local', function(err, user, info) { - - if(err) return res.sendResult(null,400,err); - if(!user) return res.sendResult(null,400,"参数错误"); - - // 获取角色信息 - var token = jwt.sign({"uid":user.id,"rid":user.rid}, jwt_config.get("secretKey"), {"expiresIn": jwt_config.get("expiresIn")}); - user.token = "Bearer " + token; - return res.sendResult(user,200,'登录成功'); - })(req, res, next); - -} + // 获取角色信息 + // 使用jsonwebtoken模块的sign方法生成JWT令牌,传入包含用户ID(uid)和角色ID(rid)的对象、配置中的密钥以及令牌过期时间等配置信息,生成一个有效的JWT令牌 + var token = jwt.sign({"uid": user.id, "rid": user.rid}, jwt_config.get("secretKey"), {"expiresIn": jwt_config.get("expiresIn")}); + // 将生成的令牌添加到用户对象中,并添加"Bearer "前缀,符合Bearer Token的规范格式,方便后续在请求头中传递和验证 + user.token = "Bearer " + token; + // 使用响应对象的sendResult方法向客户端发送包含用户信息、成功状态码(200)以及登录成功消息的响应,表示登录操作成功完成,并返回相关用户数据和令牌 + return res.sendResult(user, 200, '登录成功'); + })(req, res, next); +}; /** * token验证函数 + * 此函数用于处理基于令牌(Token)的验证逻辑,通过调用Passport的相应认证中间件验证传入的令牌是否有效, + * 根据验证结果设置请求对象(req)中的用户信息,并决定是否将请求传递给下一个中间件继续处理。 * - * @param {[type]} req 请求对象 - * @param {[type]} res 响应对象 - * @param {Function} next 传递事件函数 + * @param {[type]} req 请求对象,包含了客户端发送的请求相关信息以及在验证通过后可用于存储用户相关数据等内容,方便后续中间件使用验证后的用户信息进行业务逻辑处理。 + * @param {[type]} res 响应对象,用于向客户端发送响应信息,如在令牌验证失败时返回相应的错误消息等内容。 + * @param {Function} next 传递事件函数,用于将请求传递给下一个中间件继续处理,在令牌验证通过后会调用该函数将请求传递下去,让后续中间件继续执行相应的业务逻辑。 */ -module.exports.tokenAuth = function(req,res,next) { - passport.authenticate('bearer', { session: false },function(err,tokenData) { - if(err) return res.sendResult(null,400,'无效token'); - if(!tokenData) return res.sendResult(null,400,'无效token'); - req.userInfo = {}; - req.userInfo.uid = tokenData["uid"]; - req.userInfo.rid = tokenData["rid"]; - next(); - })(req, res, next); -} +module.exports.tokenAuth = function (req, res, next) { + // 使用Passport的authenticate方法,传入'bearer'表示采用之前配置的基于HTTP Bearer的认证策略进行令牌验证, + // 同时传入{ session: false }表示不依赖会话(Session)进行验证(常用于无状态的API认证场景,如基于JWT的认证), + // 并传入一个回调函数用于处理验证结果,该回调函数接收验证过程中的错误(err)以及验证通过后的令牌数据(tokenData)作为参数 + passport.authenticate('bearer', { session: false }, function (err, tokenData) { + // 如果验证过程中出现错误,使用响应对象(res)的sendResult方法向客户端发送包含错误状态码(400表示请求错误)和相应错误提示信息(无效token)的响应 + if (err) return res.sendResult(null, 400, '无效token'); + // 如果没有获取到有效的令牌数据(即令牌验证失败),同样使用响应对象的sendResult方法向客户端发送包含错误状态码和相应错误提示信息的响应 + if (!tokenData) return res.sendResult(null, 400, '无效token'); + // 如果令牌验证通过,在请求对象(req)中创建一个空的用户信息对象(userInfo),用于存储从令牌中解析出的相关用户信息,方便后续中间件使用 + req.userInfo = {}; + // 将从令牌数据(tokenData)中解析出的用户ID(uid)存储到请求对象的用户信息对象中 + req.userInfo.uid = tokenData["uid"]; + // 将从令牌数据(tokenData)中解析出的角色ID(rid)存储到请求对象的用户信息对象中 + req.userInfo.rid = tokenData["rid"]; + // 调用传递事件函数(next),将请求传递给下一个中间件继续处理,表示令牌验证通过,后续中间件可以基于请求对象中的用户信息进行相应的业务逻辑操作 + next(); + })(req, res, next); +} \ No newline at end of file diff --git a/modules/resextra.js b/modules/resextra.js index 313da22..8c5d67e 100644 --- a/modules/resextra.js +++ b/modules/resextra.js @@ -1,17 +1,29 @@ // 添加统一的返回结果方法 -module.exports = function(req, res, next){ - res.sendResult = function(data,code,message) { - var fmt = req.query.fmt ? req.query.fmt : "rest"; - if(fmt == "rest") { - res.json( - { - "data" : data, - "meta" : { - "msg" : message, - "status" : code - } - }); - } - }; - next(); +// 此代码将一个函数作为模块的导出内容,该函数很可能作为中间件在 Express 等 Node.js 的 Web 框架中使用, +// 目的是为响应对象(res)添加一个自定义的 `sendResult` 方法,用于统一格式化返回给客户端的结果数据。 +module.exports = function (req, res, next) { + // 为响应对象(res)添加 `sendResult` 方法,用于按照特定格式向客户端返回结果数据, + // 该方法接收要返回的数据(data)、状态码(code)以及提示消息(message)作为参数。 + res.sendResult = function (data, code, message) { + // 获取请求对象(req)中查询参数(query)里名为 `fmt` 的参数值,若不存在则默认为 "rest", + // 这个参数用于指定返回结果的格式,这里根据不同的值可以实现不同的返回格式逻辑(目前仅实现了 "rest" 格式)。 + var fmt = req.query.fmt? req.query.fmt : "rest"; + // 判断返回结果的格式是否为 "rest",如果是,则按照相应的 JSON 格式进行数据组装并返回给客户端。 + if (fmt == "rest") { + res.json( + { + // 将传入的要返回的数据(data)放置在 "data" 字段下。 + "data": data, + "meta": { + // 将传入的提示消息(message)放置在 "meta" 字段下的 "msg" 子字段中,用于告知客户端相关操作的提示信息。 + "msg": message, + // 将传入的状态码(code)放置在 "meta" 字段下的 "status" 子字段中,用于告知客户端操作的状态,比如 200 表示成功,400 表示客户端错误等。 + "status": code + } + }); + } + }; + // 调用 `next` 函数,将请求传递给下一个中间件继续处理,遵循 Express 等框架中间件的执行顺序和规范, + // 保证整个请求处理流程能够继续进行下去。 + next(); } \ No newline at end of file diff --git a/modules/ueditor.js b/modules/ueditor.js index 3d8ccb0..fcba046 100644 --- a/modules/ueditor.js +++ b/modules/ueditor.js @@ -1,67 +1,101 @@ +// 引入Lodash库,它提供了很多实用的工具函数,用于处理数据、对象、数组等操作,虽然此处未明确体现具体使用的功能,但后续可能会借助它进行一些便捷的数据处理 var _ = require('lodash'); +// 引入Node.js的path模块,用于处理文件路径相关的操作,比如拼接、解析路径等 var path = require("path"); +// 引入Busboy模块,它常用于处理文件上传的中间件,能够方便地解析包含文件的HTTP请求中的文件数据 var Busboy = require('busboy'); +// 引入Node.js的文件系统模块fs,用于对文件进行读写、查询目录等操作 var fs = require("fs"); +// 引入uniqid模块,用于生成唯一的标识符,在这里可能用于为上传的文件生成唯一的文件名 var uniqid = require('uniqid'); -var ueditor_config = require(path.join(process.cwd(),"/config/ueditor.config.js")); +// 引入UEditor的配置文件,通过拼接当前工作目录和配置文件的相对路径来获取其准确路径,该配置文件可能包含了UEditor相关的各种配置参数,如上传路径、允许的文件类型等 +var ueditor_config = require(path.join(process.cwd(), "/config/ueditor.config.js")); +// 引入项目的上传配置信息,通过配置模块(config)获取名为"upload_config"的配置项,里面应该包含了如上传目录、基础URL等与上传相关的配置内容 var upload_config = require('config').get("upload_config"); +// 定义允许上传的文件类型列表,以逗号分隔的字符串形式表示,目前包含了常见的图片文件类型以及ico、bmp文件类型 var filetype = 'jpg,png,gif,ico,bmp'; -module.exports = function(req,res,next) { - if(req.query.action == "config") { - // 吐给客户端配置信息 - res.jsonp(ueditor_config); - } else if (req.query.action === 'uploadimage' || req.query.action === 'uploadfile' || req.query.action === 'uploadvideo') { - var busboy = new Busboy({ headers: req.headers }); - busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { - var fileExtArray = filename.split("."); - var ext = fileExtArray[fileExtArray.length - 1]; - var save_filename = uniqid() + "." + ext; - var savePath = path.join(process.cwd(),upload_config.get("upload_ueditor"),save_filename); - file.on('end', function () { - var result = { - 'url': upload_config.get("baseURL")+"/" + upload_config.get("upload_ueditor") + "/" + save_filename, - 'title': req.body && req.body.pictitle || filename, - 'original': filename, - 'state': 'SUCCESS' - }; - if(req.query.encode) { - res.jsonp(result); - } else { +// 将一个函数作为模块的导出内容,这个函数很可能作为中间件在Express等Node.js的Web框架中使用,用于处理不同UEditor相关的请求操作,比如获取配置、上传文件、获取文件列表等 +module.exports = function (req, res, next) { + // 判断请求中的查询参数action的值是否为"config",如果是,则表示客户端请求获取UEditor的配置信息 + if (req.query.action == "config") { + // 使用res.jsonp方法将UEditor的配置信息(ueditor_config)返回给客户端,jsonp是一种跨域数据传输的方式,常用于解决浏览器的同源策略限制问题,使得客户端能够获取到配置数据 + res.jsonp(ueditor_config); + } else if (req.query.action === 'uploadimage' || req.query.action === 'uploadfile' || req.query.action === 'uploadvideo') { + // 创建一个Busboy实例,用于解析包含文件上传的请求,传入请求头(headers)信息,使得Busboy能够根据请求头中的相关信息(如Content-Type等)来正确解析文件数据 + var busboy = new Busboy({ headers: req.headers }); - res.redirect(upload_config.get("simple_upload_redirect") + "?result=" + JSON.stringify(result)); - // res.redirect(result.url); - } - - }); + // 监听Busboy实例的'file'事件,当解析到文件数据时,该事件会被触发,事件回调函数接收多个参数,用于获取文件相关的各种信息 + busboy.on('file', function (fieldname, file, filename, encoding, mimetype) { + // 将文件名(filename)按"."进行分割,得到一个包含文件名各部分的数组,用于提取文件的扩展名 + var fileExtArray = filename.split("."); + // 获取文件扩展名,即分割后的数组中的最后一个元素 + var ext = fileExtArray[fileExtArray.length - 1]; + // 使用uniqid模块生成一个唯一的标识符,并与文件扩展名拼接起来,作为保存文件时使用的文件名,这样可以确保文件名的唯一性,避免文件覆盖等问题 + var save_filename = uniqid() + "." + ext; + // 拼接文件保存的完整路径,通过结合当前工作目录、配置中的上传目录(upload_config.get("upload_ueditor"))以及生成的文件名(save_filename)来确定最终保存位置 + var savePath = path.join(process.cwd(), upload_config.get("upload_ueditor"), save_filename); - file.pipe(fs.createWriteStream(savePath)); - }); - req.pipe(busboy); - } else if(req.query.action === 'listimage') { - fs.readdir(path.join(process.cwd(),upload_config.get("upload_ueditor")),function(err, files){ - if(err) return res.end(); - var total = files.length; + // 监听文件流(file)的'end'事件,当文件数据全部读取完毕后,该事件会被触发,在这里可以进行一些后续操作,比如组装返回给客户端的文件上传结果信息 + file.on('end', function () { + // 组装文件上传成功后的结果对象,包含文件的访问URL、标题(可根据请求体中的pictitle字段获取,如果不存在则使用原始文件名)、原始文件名以及表示上传状态为成功的标志 + var result = { + 'url': upload_config.get("baseURL") + "/" + upload_config.get("upload_ueditor") + "/" + save_filename, + 'title': req.body && req.body.pictitle || filename, + 'original': filename, + 'state': 'SUCCESS' + }; + // 判断请求中是否包含encode参数,如果有,则使用res.jsonp方法将结果对象以JSONP的形式返回给客户端,同样是考虑到跨域等情况的一种数据返回方式 + if (req.query.encode) { + res.jsonp(result); + } else { + // 如果没有encode参数,使用res.redirect方法进行重定向,重定向的URL由配置中的简单上传重定向地址(upload_config.get("simple_upload_redirect"))和文件上传结果信息(经过JSON.stringify转换为字符串形式)拼接而成,这样客户端可以根据重定向后的地址获取到上传结果信息 + // 另一个被注释掉的res.redirect(result.url),原本可能是直接重定向到文件的访问URL,但这里采用了传递结果信息的重定向方式 + res.redirect(upload_config.get("simple_upload_redirect") + "?result=" + JSON.stringify(result)); + } + }); - var filelist = []; - var total = 0; - _(files).forEach(function(file){ - var fileExtArray = file.split("."); - var ext = fileExtArray[fileExtArray.length - 1]; - if (filetype.indexOf(ext.toLowerCase()) >= 0) { - var result_file = {}; - result_file.url = upload_config.get("baseURL")+"/" + upload_config.get("upload_ueditor") + "/" + file; - filelist.push(result_file); - total ++; - } - }); - res.jsonp({ - "state": "SUCCESS", - "list": filelist, - "start": 1, - "total": total - }); - }) - } + // 将文件流(file)通过管道(pipe)写入到创建的可写文件流(fs.createWriteStream(savePath))中,实现将上传的文件保存到指定的文件路径下 + file.pipe(fs.createWriteStream(savePath)); + }); + + // 将请求对象(req)通过管道(pipe)传入到Busboy实例中,触发Busboy开始解析请求中的文件数据,从而进入上述的文件上传处理流程 + req.pipe(busboy); + } else if (req.query.action === 'listimage') { + // 使用文件系统模块(fs)的readdir方法读取指定目录下的所有文件,目录路径通过结合当前工作目录和配置中的上传目录(upload_config.get("upload_ueditor"))来确定,读取完成后会调用回调函数处理结果(err表示读取过程中是否出现错误,files表示读取到的文件列表) + fs.readdir(path.join(process.cwd(), upload_config.get("upload_ueditor")), function (err, files) { + // 如果读取过程中出现错误,直接结束响应,不返回任何数据给客户端(这里可以考虑返回更合适的错误信息给客户端) + if (err) return res.end(); + // 初始化一个变量用于统计符合条件的文件总数,初始值为0 + var total = 0; + // 创建一个空数组,用于存放符合条件的文件信息,后续会将满足文件类型要求的文件相关信息添加到这个数组中 + var filelist = []; + + // 使用Lodash的forEach方法遍历读取到的所有文件,对每个文件进行相关处理 + _(files).forEach(function (file) { + // 将文件名按"."进行分割,获取文件扩展名,用于后续判断文件类型是否符合要求 + var fileExtArray = file.split("."); + var ext = fileExtArray[fileExtArray.length - 1]; + // 判断文件扩展名是否在允许的文件类型列表(filetype)中(将扩展名转换为小写后进行判断),如果是,则表示该文件符合要求,进行相应的信息组装和添加到文件列表操作 + if (filetype.indexOf(ext.toLowerCase()) >= 0) { + var result_file = {}; + // 组装文件的访问URL,格式与前面文件上传成功后的URL格式类似,通过配置中的基础URL、上传目录以及文件名来确定 + result_file.url = upload_config.get("baseURL") + "/" + upload_config.get("upload_ueditor") + "/" + file; + // 将组装好的文件信息对象添加到文件列表数组中 + filelist.push(result_file); + // 符合条件的文件总数加1 + total++; + } + }); + + // 使用res.jsonp方法将包含文件列表信息、状态(SUCCESS表示成功获取列表)、起始索引(这里固定为1)以及文件总数的结果对象返回给客户端,同样采用JSONP的方式考虑跨域等情况进行数据传输 + res.jsonp({ + "state": "SUCCESS", + "list": filelist, + "start": 1, + "total": total + }); + }) + } } \ No newline at end of file diff --git a/package.json b/package.json index 41138fd..85b7051 100644 --- a/package.json +++ b/package.json @@ -1,38 +1,77 @@ { +//请注意,vue-cli-plugin-element可能已经不是必需的,因为自从Vue CLI 3和Element UI 2.x版本以来, +//通常推荐使用babel-plugin-component来按需加载Element UI组件。此外,babel-eslint可能也需要更 +//新,因为ESLint现在原生支持Babel解析器(通过@babel/eslint-parser),但这取决于您的具体配置和需求。 +//另外,dependencies和devDependencies中的版本号前的^符号表示在安装依赖时,npm会安装与指定 +//版本兼容的最新版本(遵循语义化版本号)。这有助于确保您始终获得最新功能和安全修复,但也可能引 +//入不期望的更改。如果需要更严格的版本控制,可以考虑使用~(兼容补丁版本更新)或直接指定版本号(不自动更新)。 + // 项目名称 "name": "vue_shop_admin", + // 项目版本 "version": "0.1.0", + // 设置为私有项目,防止意外发布到npm "private": true, + // 定义npm脚本命令 "scripts": { + // 启动开发服务器,通常用于本地开发 "serve": "vue-cli-service serve", + // 构建生产环境的项目,生成dist目录 "build": "vue-cli-service build", + // 运行eslint检查代码质量 "lint": "vue-cli-service lint" }, + // 项目的依赖包,这些包会在项目安装时被安装到node_modules目录 "dependencies": { + // 用于发送HTTP请求的库 "axios": "^0.19.1", + // Babel插件,用于在生产环境中移除console语句 "babel-plugin-transform-remove-console": "^6.9.4", + // 包含新的JavaScript标准提案的polyfill,用于确保旧浏览器兼容 "core-js": "^3.4.4", + // 基于JavaScript的开源可视化图表库 "echarts": "^4.6.0", + // 基于Vue 2.0的桌面端组件库 "element-ui": "^2.4.5", + // JavaScript实用工具库 "lodash": "^4.17.15", + // 进度条组件库,用于显示页面加载进度 "nprogress": "^0.2.0", + // Vue.js框架 "vue": "^2.6.10", + // 富文本编辑器,基于Quill和Vue "vue-quill-editor": "^3.0.6", + // Vue.js的官方路由管理器 "vue-router": "^3.1.3", + // Vue表格组件,支持树形网格 "vue-table-with-tree-grid": "^0.2.4" }, + // 开发依赖包,仅在开发时使用,不会打包到最终项目中 "devDependencies": { + // Babel插件,支持动态import()语法 "@babel/plugin-syntax-dynamic-import": "^7.8.3", + // Vue CLI的Babel插件 "@vue/cli-plugin-babel": "^4.1.0", + // Vue CLI的ESLint插件 "@vue/cli-plugin-eslint": "^4.1.0", + // Vue CLI的服务工具,用于启动开发服务器和构建项目 "@vue/cli-service": "^4.1.0", + // Vue官方的ESLint配置 "@vue/eslint-config-standard": "^4.0.0", + // Babel和ESLint之间的桥梁,用于解析Babel代码 "babel-eslint": "^10.0.3", + // Babel插件,用于按需加载组件库(如element-ui) "babel-plugin-component": "^1.1.1", + // JavaScript的静态代码分析工具 "eslint": "^5.16.0", + // ESLint的Vue.js插件 "eslint-plugin-vue": "^5.0.0", + // CSS预处理器,LESS "less": "^3.10.3", + // webpack的loader,用于编译LESS文件 "less-loader": "^5.0.0", + // Vue CLI的element-ui插件(可能已经过时,因为可以直接通过babel-plugin-component配置) "vue-cli-plugin-element": "^1.0.1", + // Vue.js的模板编译器,用于将Vue模板预编译为渲染函数 "vue-template-compiler": "^2.6.10" } -} +} \ No newline at end of file diff --git a/public/index.html b/public/index.html index fe315e9..4de64c1 100644 --- a/public/index.html +++ b/public/index.html @@ -1,44 +1,62 @@ + -
+ + + + + + -