shenxianbao_branch
sxb 9 months ago
parent f17ac58cf3
commit 3f6a5d4a2d

@ -12,190 +12,151 @@
* Date: 2016-05-20T17:17Z
*/
// 立即执行函数依据不同环境导出jQuery模块接收全局对象和工厂函数作为参数
// 立即执行函数依据不同环境导出jQuery模块.接收全局对象和工厂函数作为参数
(function( global, factory ) {
// 判断是否为CommonJS环境如Node.js
if ( typeof module === "object" && typeof module.exports === "object" ) {
// 根据全局对象有无document属性来决定如何导出jQuery
module.exports = global.document?
factory( global, true ) :
function( w ) {
// 若传入对象无document属性则抛错提示jQuery依赖含document的window对象
if (!w.document ) {
throw new Error( "jQuery需要一个包含document的window对象");
}
return factory( w );
};
} else {
// 非CommonJS环境直接调用工厂函数创建jQuery
factory( global );
}
}(typeof window!== "undefined"? window : this, function( window, noGlobal ) {
// 存储已删除ID的数组用于后续相关逻辑可能与DOM元素管理等有关
var deletedIds = [];
// 获取全局document对象方便后续DOM操作
var document = window.document;
// 借用deletedIds数组的部分方法便于后续直接调用
var slice = deletedIds.slice;
var concat = deletedIds.concat;
var push = deletedIds.push;
var indexOf = deletedIds.indexOf;
// 用于类名与类型映射的空对象
var class2type = {};
// 获取class2type的toString方法用于类型判断等操作
var toString = class2type.toString;
// 获取class2type的hasOwnProperty方法判断对象自身属性
var hasOwn = class2type.hasOwnProperty;
// 存储浏览器特性支持情况的空对象,用于跨浏览器兼容处理
var support = {};
// jQuery版本号
var version = "1.12.4";
// jQuery函数返回增强后的init构造函数实例便于链式调用等操作
var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};
// 匹配去除字符串首尾空白字符(含特殊空白字符)的正则
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
// 匹配以"-ms-"开头字符串的正则,用于处理特定浏览器前缀样式相关
var rmsPrefix = /^-ms-/;
// 匹配替换字符串中“-”后接字母或数字字符的正则,用于样式名等转换
var rdashAlpha = /-([\da-z])/gi;
// 将“-”后接字母转换为大写(用于驼峰命名转换)的回调函数
var fcamelCase = function( all, letter ) {
return letter.toUpperCase();
};
// jQuery的原型对象定义众多实例方法
jQuery.fn = jQuery.prototype = {
// 当前jQuery版本号便于版本相关操作及调试查看
jquery: version,
// 构造函数指向jQuery本身确保原型链正确
constructor: jQuery,
// 初始选择器字符串,后续可能据此操作元素等
selector: "",
// jQuery对象默认长度为0后续根据选中元素数量更新
length: 0,
// 将jQuery对象转换为真正数组的方法
toArray: function() {
return slice.call( this );
},
// 获取指定位置元素或所有元素组成的数组
get: function( num ) {
return num!= null?
( num < 0? this[ num + this.length ] : this[ num ] ) :
slice.call( this );
},
// 把元素数组推入jQuery对象栈并返回新对象的方法
pushStack: function( elems ) {
var ret = jQuery.merge( this.constructor(), elems );
ret.prevObject = this;
ret.context = this.context;
return ret;
},
// 遍历jQuery对象元素并执行回调函数的方法
each: function( callback ) {
return jQuery.each( this, callback );
},
// 对元素映射并返回新jQuery对象的方法
map: function( callback ) {
return this.pushStack( jQuery.map( this, function( elem, i ) {
return callback.call( elem, i, elem );
}));
},
// 截取部分元素返回新jQuery对象的方法
slice: function() {
return this.pushStack( slice.apply( this, arguments ));
},
// 获取第一个元素的方法调用eq(0)实现
first: function() {
return this.eq( 0 );
},
// 获取最后一个元素的方法调用eq(-1)实现
last: function() {
return this.eq( -1 );
},
// 获取指定位置元素的方法(支持负数索引从后往前计数)
eq: function( i ) {
var len = this.length;
var j = +i + ( i < 0? len : 0 );
return this.pushStack( j >= 0 && j < len? [ this[ j ] ] : [] );
},
// 结束当前操作返回上一个jQuery对象若有的方法
end: function() {
return this.prevObject || this.constructor();
},
// 从数组对象借用的方法,用于内部类似数组操作
push: push,
sort: deletedIds.sort,
splice: deletedIds.splice
};
// 用于扩展jQuery对象本身或其原型对象的方法
jQuery.extend = jQuery.fn.extend = function() {
var src, copyIsArray, copy, name, options, clone;
var target = arguments[ 0 ] || {};
var i = 1;
var length = arguments.length;
var deep = false;
// 处理深度复制情况,解析参数相关逻辑
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[ i ] || {};
i++;
}
if ( typeof target!== "object" &&!jQuery.isFunction( target ) ) {
target = {};
}
if ( i === length ) {
target = this;
i--;
}
// 遍历要扩展的对象进行扩展操作
for ( ; i < length; i++ ) {
if ( ( options = arguments[ i ] )!= null ) {
for ( name in options ) {
src = target[ name ];
copy = options[ name ];
if ( target === copy ) {
continue;
}
// 深度复制逻辑(此处省略具体代码),处理合并对象或数组情况
}
}
}
};
});
var someFunction = function( deep, copy, target ) {
// 检查是否进行深度拷贝且copy是一个纯对象或数组
if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
( copyIsArray = jQuery.isArray( copy ) ) ) ) {
// 如果copy是数组
if ( copyIsArray ) {
copyIsArray = false; // 重置标志位,因为已经处理过是数组的情况
clone = src && jQuery.isArray( src ) ? src : []; // 根据src是否为数组来决定clone是src的引用还是新数组
} else {
// 如果copy是纯对象
clone = src && jQuery.isPlainObject( src ) ? src : {}; // 根据src是否为纯对象来决定clone是src的引用还是新对象
}
// 从不直接移动原始对象,而是克隆它们
// 使用jQuery.extend进行合并可能涉及深度拷贝
target[ name ] = jQuery.extend( deep, clone, copy );
// 以下代码块被包含在一个方法中(从代码结构推测,不过完整方法定义未完全展示,这里主要关注这段代码逻辑),整体逻辑是对一些输入数据进行验证,
// 然后将数据封装到`UserWant`对象中,并尝试插入到数据库(通过调用`userWantService.insertSelective`方法推测是执行插入操作),根据插入结果进行不同的页面重定向操作。
try {
// 检查`name`和`remark`的长度是否满足要求,若`name`的长度小于1或者`remark`的长度小于1说明输入的名称或者备注内容为空不符合要求
// 又或者`name`的长度大于25或者`remark`的长度大于25说明输入的长度超出了限定的最大长度可能是为了控制数据长度避免存储或展示问题
// 只要满足这些不符合要求的长度条件之一,就重定向到`require_product.do`页面,这里可能是让用户重新输入符合要求的数据。
if (name.length() < 1 || remark.length() < 1 || name.length() > 25 || remark.length() > 25) {
return "redirect:require_product.do";
}
} catch (Exception e) {
// 如果在上述长度验证过程中出现异常(比如调用`length`方法出现问题等异常情况),打印异常堆栈信息(方便调试查看具体出错原因),
// 然后重定向到`require_product.do?error=1`页面,通过添加`error=1`参数可能是为了在前端页面显示相应的错误提示,告知用户出现了异常情况导致操作无法正常进行。
e.printStackTrace();
return "redirect:require_product.do?error=1";
}
// 创建一个`UserWant`对象,这个对象大概率是用于封装用户相关需求信息的数据模型类(从命名和后续设置属性的操作推测),用于后续存储到数据库或者传递给其他业务逻辑处理。
UserWant userWant = new UserWant();
// 设置`UserWant`对象的`modified`属性为当前日期时间,通过`new Date()`获取当前时间并赋值,可能用于记录该用户需求信息的修改时间等用途。
userWant.setModified(new Date());
// 设置`UserWant`对象的`name`属性,将前面验证过长度的`name`变量的值赋给它,用于存储用户需求的名称相关信息。
userWant.setName(name);
// 设置`UserWant`对象的`price`属性,通过`new BigDecimal(price)`将`price`变量(应该是表示价格的数据,可能是字符串或者其他基础类型,这里转换为`BigDecimal`类型,通常用于精确的金额计算等场景)转换为`BigDecimal`类型后赋值给`price`属性,用于存储用户需求的价格相关信息。
userWant.setPrice(new BigDecimal(price));
// 设置`UserWant`对象的`quantity`属性,将`quantity`变量的值赋给它,用于存储用户需求的数量相关信息。
userWant.setQuantity(quantity);
// 设置`UserWant`对象的`remark`属性,将前面验证过长度的`remark`变量的值赋给它,用于存储用户需求的备注相关信息。
userWant.setRemark(remark);
// 设置`UserWant`对象的`uid`属性,通过从请求的会话(`request.getSession()`)中获取`uid`属性值(并强制转换为`Integer`类型,说明`uid`在会话中存储的应该是能转换为整数的类型,比如数字或者字符串表示的数字等),
// 这个`uid`大概率是用于标识用户的唯一ID用于关联该用户需求信息到具体的用户账号。
userWant.setUid((Integer) request.getSession().getAttribute("uid"));
// 设置`UserWant`对象的`sort`属性,将`sort`变量的值赋给它,这里的`sort`从命名推测可能是用于表示排序相关的字段,具体作用需结合业务逻辑进一步确定。
userWant.setSort(sort);
// 定义一个变量`result`用于存储后续数据库插入操作的结果,初始化为未赋值状态,后续会根据插入操作的实际情况进行赋值并判断。
int result;
try {
// 调用`userWantService`对象的`insertSelective`方法(这里`userWantService`应该是一个业务逻辑层的服务类,`insertSelective`方法从命名推测是执行有选择性的插入操作,可能会根据`UserWant`对象中属性的具体情况进行插入,比如某些属性为空时的特殊处理等),
// 将`userWant`对象作为参数传入执行插入操作并将返回的结果通常是表示插入成功的记录数等比如插入成功返回1失败返回其他值赋值给`result`变量。
result = userWantService.insertSelective(userWant);
// 判断插入操作的结果,如果`result`不等于1说明插入操作没有成功插入1条记录可能是插入失败或者出现了其他不符合预期的情况
// 则重定向到`/require_product.do?error=2`页面,同样通过`error=2`参数可能是为了在前端页面显示相应的错误提示,告知用户插入操作出现问题。
if (result!= 1) {
// map.put("result", result);
return "redirect:/require_product.do?error=2";
}
} catch (Exception e) {
// 如果在执行插入操作过程中出现异常(比如数据库连接问题、数据插入违反约束等异常情况),打印异常堆栈信息(方便调试查看具体出错原因),
// 然后重定向到`/require_product.do?error=2`页面,和上面插入失败的重定向页面一样,提示用户出现错误。
e.printStackTrace();
// map.put("result", result);
return "redirect:/require_product.do?error=2";
}
// 若插入操作成功(即`result`等于1没有进入上面的重定向逻辑重定向到`/my_require_product.do`页面,这里可能是跳转到展示用户已成功提交的求购信息等相关页面。
// map.put("result", result);
return "redirect:/my_require_product.do";
}
// 如果copy不是undefined则直接赋值给target[name]
} else if ( copy !== undefined ) {
target[ name ] = copy;
}
}
// `getUserWant`方法,通过`@RequestMapping`注解配置了可以处理的请求路径为`/my_require_product.do`和`/my_require_product_page.do`
// 作用应该是查看我的求购信息,从方法接收的参数以及内部逻辑来看,会从会话中获取用户信息,查询对应的求购记录,并进行一些数据格式转换后传递给视图层进行展示。
@RequestMapping(value = {"/my_require_product.do", "/my_require_product_page.do"})
public String getUserWant(HttpServletRequest request, Model model) {
// 定义一个列表`list`,用于存储查询到的`UserWant`类型的求购信息列表,初始化为未赋值状态,后续会通过查询数据库等操作来填充数据。
List<UserWant> list;
// 从请求的会话(`request.getSession()`)中获取`userInformation`属性值(并强制转换为`UserInformation`类型,说明在会话中存储的是与用户信息相关的数据,并且类型应该是能转换为`UserInformation`类型的,比如一个存储用户详细信息的对象),
// 如果获取到的`userInformation`为空(通过`StringUtils.getInstance().isNullOrEmpty`方法判断,这里`StringUtils`应该是一个工具类,用于判断字符串或者对象是否为空等情况,`isNullOrEmpty`方法实现了具体的空值判断逻辑),
// 说明用户可能未登录或者会话中用户信息丢失等情况,此时重定向到`/login.do`页面,让用户先登录获取有效的用户信息。
UserInformation userInformation = (UserInformation) request.getSession().getAttribute("userInformation");
if (StringUtils.getInstance().isNullOrEmpty(userInformation)) {
return "redirect:/login.do";
}
try {
// 从请求的会话(`request.getSession()`)中获取`uid`属性值(并强制转换为`int`类型,说明`uid`在会话中存储的应该是能转换为整数的类型,比如数字或者字符串表示的数字等),
// 这个`uid`大概率是用于标识用户的唯一ID用于查询该用户对应的求购信息。
int uid = (int) request.getSession().getAttribute("uid");
// list = selectUserWantByUid(4);
// 调用`selectUserWantByUid`方法这里推测是一个数据访问层的方法用于根据用户ID查询该用户的求购信息列表传入获取到的`uid`作为参数,查询该用户对应的求购信息列表,并将结果赋值给`list`变量。
list = selectUserWantByUid(uid);
// 创建一个`UserWantBean`类型的列表`userWantBeans`,用于存储经过格式转换等处理后的求购信息列表,初始化为空列表,后续会将处理后的求购信息逐个添加到这个列表中。
List<UserWantBean> userWantBeans = new ArrayList<>();
// 遍历查询到的`UserWant`类型的求购信息列表`list`,对于每个`UserWant`对象进行以下处理。
for (UserWant userWant : list) {
// 创建一个`UserWantBean`对象,这个对象从命名推测可能是用于展示给视图层的求购信息的数据模型类,可能和`UserWant`对象有一定的关联,但格式更适合视图层展示等用途。
UserWantBean userWantBean = new UserWantBean();
// 设置`UserWantBean`对象的`id`属性,将当前遍历到的`UserWant`对象的`id`属性值赋给它用于存储求购信息的唯一标识ID。
userWantBean.setId(userWant.getId());
// 设置`UserWantBean`对象的`modified`属性,将当前遍历到的`UserWant`对象的`modified`属性值赋给它,用于存储求购信息的修改时间等相关信息。
userWantBean.setModified(userWant.getModified());
// 设置`UserWantBean`对象的`name`属性,将当前遍历到的`UserWant`对象的`name`属性值赋给它,用于存储求购信息的名称相关信息。
userWantBean.setName(userWant.getName());
// 设置`UserWantBean`对象的`price`属性,通过调用当前遍历到的`UserWant`对象的`price`属性的`doubleValue`方法(因为`UserWant`对象中的`price`可能是`BigDecimal`类型,这里转换为`double`类型,方便在视图层展示或者后续可能的计算等操作),
// 将转换后的价格值赋给`UserWantBean`对象的`price`属性,用于存储求购信息的价格相关信息。
userWantBean.setPrice(userWant.getPrice().doubleValue());
// 设置`UserWantBean`对象的`uid`属性,将前面获取到的`uid`当前用户的唯一ID赋给它用于标识该求购信息所属的用户。
userWantBean.setUid(uid);
// 设置`UserWantBean`对象的`quantity`属性,将当前遍历到的`UserWant`对象的`quantity`属性值赋给它,用于存储求购信息的数量相关信息。
userWantBean.setQuantity(userWant.getQuantity());
// 设置`UserWantBean`对象的`remark`属性,将当前遍历到的`UserWant`对象的`remark`属性值赋给它,用于存储求购信息的备注相关信息。
userWantBean.setRemark(userWant.getRemark());
// 设置`UserWantBean`对象的`sort`属性,通过调用`getSort`方法(这里推测是一个用于处理排序相关逻辑的方法,比如将数据库中存储的排序字段值转换为视图层合适的展示形式等),
// 将`UserWant`对象的`sort`属性作为参数传入,获取处理后的排序信息并赋给`UserWantBean`对象的`sort`属性,用于存储求购信息的排序相关信息。
userWantBean.setSort(getSort(userWant.getSort()));
// 将处理好的`UserWantBean`对象添加到`userWantBeans`列表中,这样就完成了对一个求购信息的格式转换和添加操作,循环结束后`userWantBeans`列表就包含了所有经过处理的求购信息。
userWantBeans.add(userWantBean);
}
// 将处理好的求购信息列表`userWantBeans`添加到`model`对象中在Spring MVC等框架中`model`通常用于向视图层传递数据,这里添加后在视图层就可以获取并展示这些求购信息了),属性名为`userWant`,视图层可以通过这个属性名获取对应的求购信息列表进行展示。
model.addAttribute("userWant", userWantBeans);
} catch (Exception e) {
// 如果在查询、处理求购信息过程中出现异常(比如数据库查询失败、数据转换出错等异常情况),打印异常堆栈信息(方便调试查看具体出错原因),
// 然后重定向到`/`根页面,这里可能是一种简单的错误处理方式,让用户回到首页等相对稳定的页面,避免出现错误页面无法操作的情况。
e.printStackTrace();
return "redirect:/";
}
// 将用户信息`userInformation`添加到`model`对象中,同样方便视图层获取并展示用户相关的详细信息,比如用户名、头像等信息(具体取决于`UserInformation`对象中存储的内容)。
model.addAttribute("userInformation", userInformation);
// 返回视图名称`"page/personal/my_require_product_page"`在Spring MVC等框架中会根据这个视图名称去查找对应的视图文件比如JSP、Thymeleaf等模板文件进行渲染展示这里就是将处理好的用户求购信息和用户信息传递给对应的视图进行展示操作。
return "page/personal/my_require_product_page";
}
// jQuery的静态方法集合
// `getUserWantCounts.do`方法,通过`@RequestMapping`注解配置了可以处理的请求路径为`/getUserWantCounts.do`
// 并且通过`@ResponseBody`注解表示该方法返回的结果会直接作为响应体返回比如返回JSON格式的数据等常用于给前端提供数据接口不需要经过视图层渲染等操作
// 作用应该是查看求购总数,从方法接收的参数以及内部逻辑来看,会先判断用户是否登录,然后查询该用户的求购总数并返回给前端。
@RequestMapping(value = "/getUserWantCounts.do")
@ResponseBody
public Map getUserWantCounts(HttpServletRequest request, Model model) {
// 创建一个`Map`类型的对象`map`,用于存储要返回的数据,这里主要是存储求购总数相关的信息,初始化为空的`HashMap`,后续会根据查询结果添加数据到这个`map`中。
Map<String, Integer> map = new HashMap<>();
// 判断请求会话中的`userInformation`属性值是否为空(通过`StringUtils.getInstance().isNullOrEmpty`方法判断,和前面判断用户信息是否为空的逻辑类似,用于确定用户是否登录或者有有效的用户信息),
// 如果为空,说明用户可能未登录等情况,此时将`"counts"`作为键,`-1`作为值添加到`map`中(通过`map.put("counts", -1)`操作),表示没有获取到有效的求购总数信息(用`-1`可能是一种约定的表示错误或者无数据的方式),然后直接返回`map`对象,将这个包含错误信息的`map`作为响应体返回给前端。
if (StringUtils.getInstance().isNullOrEmpty(request.getSession().getAttribute("userInformation"))) {
map.put("counts", -1);
return map;
}
try {
// 调用`getUserWantCounts`方法这里推测是一个数据访问层或者业务逻辑层的方法用于根据用户ID查询该用户的求购总数传入从请求会话中获取到的`uid`用户唯一ID作为参数查询该用户的求购总数
// 并将查询到的求购总数赋值给`counts`变量,然后将`"counts"`作为键,查询到的`counts`值作为值添加到`map`中(通过`map.put("counts", counts)`操作),用于准备返回给前端的数据。
int counts = getUserWantCounts((Integer) request.getSession().getAttribute("uid"));
map.put("counts", counts);
} catch (Exception e) {
// 如果在查询求购总数过程中出现异常(比如数据库查询失败等异常情况),打印异常堆栈信息(方便调试查看具体出错原因),
// 然后将`"counts"`作为键,`-1`作为值添加到`map`中(通过`map.put("counts", -1)`操作),同样表示出现错误没有获取到有效的求购总数信息,最后返回`map`对象,将包含错误信息的`map`作为响应体返回给前端。
e.printStackTrace();
map.put("counts", -1);
}
// 返回`map`对象,将存储着求购总数信息(正常情况下是实际查询到的总数,出现异常则是`-1`表示错误)的`map`作为响应体返回给前端,前端可以根据接收到的数据进行相应的展示或者处理。
return map;
}
jQuery.extend( {
// 每个jQuery实例在页面上的唯一标识符

Loading…
Cancel
Save