欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > 【头歌平台实验】【项目设计】【项目实践】【Python文件之CSV模块读写文件】

【头歌平台实验】【项目设计】【项目实践】【Python文件之CSV模块读写文件】

2024/10/23 15:22:25 来源:https://blog.csdn.net/DarkComxEating/article/details/142937782  浏览:    关键词:【头歌平台实验】【项目设计】【项目实践】【Python文件之CSV模块读写文件】

项目设计

这个项目因为是Spring框架的项目,需要多等待一会儿才能测评成功,网络条件不好的话,容易测评不通过。

第一关

package com.jfinalshop.controller.demo;
import com.jfinal.core.Controller;public class HelloController extends Controller {public void index() {/***完成index方法**使用renderText(String str)方法在目标网页上打印一行字符串:*Hello JFinal World!*///请在这里补充代码/********** Begin *********/renderText("Hello JFinal World!");/********** End **********/}
}

第二关

package com.jfinalshop.model;
import java.util.List;
import org.apache.commons.codec.digest.DigestUtils;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;// 实体类 - 管理员
public class Admin extends Model<Admin>{private static final long serialVersionUID = -57555379613217315L;public static final String HASH_ALGORITHM = "SHA-1";public static final int HASH_INTERATIONS = 1024;public static final Admin dao = new Admin();public List<Role> getRoleList() {String sql =""+" select r.*"+"  from admin_role a left outer join role r on a.roleset_id = r.id "+" where a.adminset_id = ?";return Role.dao.find(sql,getStr("id"));}// 根据用户名获取管理员对象,若管理员不存在,则返回null(不区分大小写)public Admin getAdminByUsername(String username) {// 请在这里补充代码,完成本方法/********** Begin *********/return dao.findFirst("select * from admin where username = ?",username);/********** End **********/}// 根据用户名、密码验证管理员public boolean verifyAdmin(String username, String password) {/********** Begin *********/Admin member = getAdminByUsername(username);if (member != null && member.getStr("password").equals(DigestUtils.md5Hex(password))) {return true;} else {return false;}/********** End **********/}// 根据用户ID查询该用户所拥有的角色列表public List<String> getRolesName(String adminId) {String sql =  ""+"select r.value"+"  from admin a"+"  left outer join admin_role ar"+"    on a.id = ar.adminset_id"+"  left outer join role r"+"    on r.id = ar.roleset_id"+" where a.id = ?";return Db.query(sql, adminId);}// 根据用户ID查询该用户所拥有的权限列表public List<String> getAuthoritiesName(String adminId) {String sql = ""+ "select a.value"+"  from admin u"+"  left outer join admin_role ru"+"    on u.id = ru.adminset_id"+"  left outer join role r"+"    on ru.roleset_id = r.id"+"  left outer join role_resource ra"+"    on r.id = ra.roleset_id"+"  left outer join resource a"+"    on ra.resourceset_id = a.id"+" where u.id = ?";return Db.query(sql, adminId);}
}

第三关

package com.jfinalshop.controller.admin;
import java.util.Date;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import cn.dreampie.shiro.core.SubjectKit;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.aop.Duang;
import com.jfinal.ext.plugin.shiro.ShiroMethod;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.tx.Tx;
import com.jfinalshop.bean.SystemConfig;
import com.jfinalshop.model.Admin;
import com.jfinalshop.model.AdminRole;
import com.jfinalshop.model.Article;
import com.jfinalshop.model.Member;
import com.jfinalshop.model.Message;
import com.jfinalshop.model.Orders;
import com.jfinalshop.model.Product;
import com.jfinalshop.model.Role;
import com.jfinalshop.service.MenuService;
import com.jfinalshop.util.SystemConfigUtil;
import com.jfinalshop.validator.admin.AdminValidator;
/*** 后台类 - 后台管理、管理员* */
public class AdminController extends BaseAdminController<Admin>{private Admin admin;private MenuService menuService = Duang.duang(MenuService.class);// 登录页面@Clearpublic void login(){SystemConfig systemConfig = SystemConfigUtil.getSystemConfig();setAttr("systemConfig", systemConfig);setAttr("base", getRequest().getContextPath());render("/admin/admin_login.html");}@Clearpublic void jqgrid() {setAttr("base", getRequest().getContextPath());render("/jqgrid.html");}@Clearpublic void singIn() {String username = getPara("username","");String password = getPara("password","");String captchaToken = getPara("captchaToken");boolean rememberMe = getPara("remember","").equals("on") ? true : false;//请在这里补充代码,对页面填入的用户名、密码以及验证码做合法性验证,若合法,则获取Admin对象/********** Begin *********/if(StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) {renderErrorMessage("账号或密码不能为空!");return;}if (!SubjectKit.doCaptcha("captcha", captchaToken)) {renderErrorMessage("验证码错误!");return;}Admin admin = Admin.dao.getAdminByUsername(username);/********** End **********/// 开始验证Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken(username, DigestUtils.md5Hex(password));token.setRememberMe(rememberMe);try {subject.login(token);} catch (UnknownAccountException ue) {token.clear();renderErrorMessage("登录失败,您输入的账号不存在!");return;} catch (IncorrectCredentialsException ie) {token.clear();SystemConfig systemConfig = getSystemConfig();if (systemConfig.getIsLoginFailureLock()) {int loginFailureLockCount = getSystemConfig().getLoginFailureLockCount();int loginFailureCount = admin.getInt("loginFailureCount") + 1;if (loginFailureCount >= systemConfig.getLoginFailureLockCount()) {admin.set("isAccountLocked", true);admin.set("lockedDate", new Date());admin.update();}admin.set("loginFailureCount", loginFailureCount);updated(admin);if (loginFailureLockCount - loginFailureCount <= 3) {renderErrorMessage("若连续" + loginFailureLockCount + "次密码输入错误,您的账号将被锁定,还有" + (loginFailureLockCount - admin.getInt("loginFailureCount")) + " 次机会。");return;} else {renderErrorMessage("您的用户名或密码错误!");return;}} else {renderErrorMessage("您的用户名或密码错误!");return;}} catch(LockedAccountException le){token.clear();renderErrorMessage("用户被锁定!");return;} catch (RuntimeException re) {re.printStackTrace();token.clear();renderErrorMessage("登录失败");return;}// 登录成功后if(ShiroMethod.authenticated()) {//请在此处补充代码,将登录成功的admin信息进行更新,更新项目包括登录时间、登录ip以及登录失败次数。最后记得重定向到路径"/admin/center"下/********** Begin *********/admin.set("loginDate", new Date());admin.set("loginIp", getRequest().getRemoteAddr());admin.set("loginFailureCount", 0);updated(admin);redirect("/admin/center");/********** End **********/}}// 添加public void add() {setAttr("allRole", Role.dao.getAllRole());render("/admin/admin_input.html");}// 编辑public void edit() {String id = getPara("id","");if(StrKit.notBlank(id)){setAttr("admin", Admin.dao.findById(id));}        setAttr("allRole", Role.dao.getAllRole());render("/admin/admin_input.html");}// 保存@Before({Tx.class,AdminValidator.class})public void save(){admin = getModel(Admin.class);String[] roleIds = getParaValues("roleList.id");admin.set("username",admin.getStr("username").toLowerCase());admin.set("loginFailureCount",0);admin.set("isAccountLocked",false);admin.set("isAccountExpired",false);admin.set("isCredentialsExpired",false);admin.set("password",DigestUtils.md5Hex(admin.getStr("password")));saved(admin);if (roleIds.length == 0) {renderErrorMessage("请至少选择一个角色!");return;}for (String roleId : roleIds) {AdminRole adminRole = new AdminRole();adminRole.set("adminSet_id", admin.getStr("id"));adminRole.set("roleSet_id", roleId);adminRole.save();}redirect("/admin/list");    }// 更新@Before({Tx.class,AdminValidator.class})public void update(){admin = getModel(Admin.class);String[] roleIds = getParaValues("roleList.id");if (StringUtils.isNotEmpty(admin.getStr("password"))) {String passwordMd5 = DigestUtils.md5Hex(admin.getStr("password"));admin.set("password",passwordMd5);}else{admin.remove("password");}updated(admin);// 先删除再写入String adminId = admin.getStr("id");if (AdminRole.dao.deleteById(adminId)){if (roleIds.length == 0){renderErrorMessage("请至少选择一个角色!");return;}            for(String roleId : roleIds){        AdminRole adminRole = new AdminRole();adminRole.set("adminSet_id", adminId);adminRole.set("roleSet_id", roleId);adminRole.save();            }}redirect("/admin/list");}// 删除@Before(Tx.class)public void delete(){String[] ids = getParaValues("ids");if (ids != null && ids.length > 0){for (String id : ids) {if(AdminRole.dao.deleteById(id) && Admin.dao.deleteById(id)){    ajaxJsonSuccessMessage("删除成功!");}else{ajaxJsonErrorMessage("删除失败!");}}}        }// 管理员退出public void logout() {Subject currentUser = SecurityUtils.getSubject();if (SecurityUtils.getSubject().getSession() != null) {currentUser.logout();}redirect("/admin/login");}// 后台首页@RequiresRoles(value={"ROLE_ADMIN","ROLE_SERVICE"},logical=Logical.OR)@RequiresPermissions("admin")public void index(){    setAttr("java_version", System.getProperty("java.version"));setAttr("os", System.getProperty("os.name"));setAttr("os_arch", System.getProperty("os.arch"));setAttr("os_version", System.getProperty("os.version"));setAttr("user_dir", System.getProperty("user.dir"));setAttr("tmpdir", System.getProperty("java.io.tmpdir"));    setAttr("unprocessedOrderCount", getUnprocessedOrderCount());// 未处理订单setAttr("paidUnshippedOrderCount", getPaidUnshippedOrderCount()); // 等待发货订单数setAttr("unreadMessageCount", getUnreadMessageCount()); // 未读消息setAttr("storeAlertCount", getStoreAlertCount()); // 商品库存报警setAttr("marketableProductCount", getMarketableProductCount()); // 已上架商品setAttr("unMarketableProductCount", getUnMarketableProductCount()); // 已下架商品setAttr("memberTotalCount", getMemberTotalCount()); // 会员总数setAttr("articleTotalCount", getArticleTotalCount()); // 文章总数render("/admin/admin_index.html");}    // 获取未处理订单数public Long getUnprocessedOrderCount() {return Orders.dao.getUnprocessedOrderCount();}// 获取已支付未发货订单数public Long getPaidUnshippedOrderCount() {return Orders.dao.getPaidUnshippedOrderCount();}// 获取未读消息数public Long getUnreadMessageCount() {return Message.dao.getUnreadMessageCount();}// 获取商品库存报警数public Long getStoreAlertCount() {return Product.dao.getStoreAlertCount();}// 获取已上架商品数public Long getMarketableProductCount() {return Product.dao.getMarketableProductCount();}// 获取已下架商品数public Long getUnMarketableProductCount() {return Product.dao.getUnMarketableProductCount();}// 获取会员总数public Long getMemberTotalCount() {return Member.dao.getTotalCount();}// 获取文章总数public Long getArticleTotalCount() {return Article.dao.getTotalCount();}// 后台主页面public void center(){setAttr("menuList",menuService.getMenuTree());setAttr("loginUsername", getLoginAdminName());setAttr("countMail",getUnreadMessageCount());render("/admin/admin_center.html");}// 后台Header/*public void header(){setAttr("loginUsername", getLoginAdminName());render("/admin/admin_header.html");}*/// 后台中间(显示/隐藏菜单)public void middle(){render("/admin/admin_middle.html");}// 列表public void list() {findByPage();render("/admin/admin_list.html");}}

第四关

package com.jfinalshop.model;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang.StringUtils;
import com.alibaba.fastjson.JSON;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import com.jfinalshop.bean.HtmlConfig;
import com.jfinalshop.bean.ProductImage;
import com.jfinalshop.controller.shop.BaseShopController.OrderType;
import com.jfinalshop.service.ProductImageService;
import com.jfinalshop.util.CommonUtil;
import com.jfinalshop.util.SystemConfigUtil;
import com.jfinalshop.util.TemplateConfigUtil;
/*** 实体类 - 商品* */
public class Product extends Model<Product>{private static final long serialVersionUID = -8178061660099975236L;public static final Product dao = new Product();public static final int MAX_BEST_PRODUCT_LIST_COUNT = 20;// 精品商品列表最大商品数public static final int MAX_NEW_PRODUCT_LIST_COUNT = 20;// 新品商品列表最大商品数public static final int MAX_HOT_PRODUCT_LIST_COUNT = 20;// 热销商品列表最大商品数public static final int DEFAULT_PRODUCT_LIST_PAGE_SIZE = 12;// 商品列表默认每页显示数// 重量单位(克、千克、吨)public enum WeightUnit {g, kg, t}// 商品属性存储private Map<String, String> productAttributeMapStore = new HashMap<String, String>();private ProductImageService productImageService = new ProductImageService();/*** 根据分页对象搜索产品* * @return 分页对象*/public Page<Product> search(int pageNumber, int pageSize, String keyword, String orderBy, OrderType orderType) {//请在这里补充代码/********** Begin *********/String select = "select * ";String sqlExceptSelect = " from product where isMarketable = true ";if (StrKit.notBlank(keyword)) {sqlExceptSelect += " and name like '%" + keyword + "%'";}if (StrKit.notBlank(orderBy) && StrKit.notBlank(orderType.name())){sqlExceptSelect += " order by " + orderBy +" "+ orderType;}Page<Product> pager = dao.paginate(pageNumber, pageSize, select, sqlExceptSelect);return pager;/********** End **********///请务必在完成代码填写后删除该语句!}/*** 根据分页对象搜索产品* * @return 分页对象*/public Page<Product> categorySearch(int pageNumber, int pageSize, ProductCategory productCategory, String orderBy, OrderType orderType) {String select = "select p.* ";String sqlExceptSelect ="" +"  from product p "+" inner join productcategory c " +"   on p.productcategory_id = c.id " +" where (p.productcategory_id = ? or c.path like ?) " +"  and p.ismarketable = ? ";if (StrKit.notBlank(orderBy) && StrKit.notBlank(orderType.name())){sqlExceptSelect += " order by " + orderBy +" "+ orderType;}Page<Product> pager = dao.paginate(pageNumber, pageSize, select, sqlExceptSelect,productCategory.getStr("id"),productCategory.getStr("path") + "%",true);return pager;}/*** 根据Member、Pager获取收藏商品分页对象* * @param member*            Member对象*            * @return 收藏商品分页对象*/public Page<Product> getFavoriteProductPager(Member member,int pageSize) {String select = "SELECT p.*,mp.favoriteMemberSet_id ";String sqlExceptSelect = "" +"  from product p"+" inner join member_product mp" +"   on p.id = mp.favoriteproductset_id" +" inner join member m" +"   on mp.favoritememberset_id = m.id" +" where m.id = ?" +" order by p.name desc, p.createdate desc";Page<Product> list = dao.paginate(1, pageSize, select, sqlExceptSelect,member.getStr("id"));return list;}// 重写方法,保存对象的同时处理价格精度并生成HTML静态文件public void save(Product product) {HtmlConfig htmlConfig = TemplateConfigUtil.getHtmlConfig(HtmlConfig.PRODUCT_CONTENT);String htmlFilePath = htmlConfig.getHtmlFilePath();product.set("id", CommonUtil.getUUID());product.set("htmlFilePath",htmlFilePath);product.set("createDate", new Date());product.save();}// get产品分类public ProductCategory getProductCategory(){return ProductCategory.dao.findById(getStr("productCategory_id"));        }// get 品牌public Brand getBrand(){return Brand.dao.findById(getStr("brand_id"));        }// 产品类型public ProductType getProductType() {return ProductType.dao.findById(getStr("productType_id"));}/*** 根据SN判断数据是否已存在.* */public boolean isExist(String productSn){return dao.findFirst("select * from product t where t.productSn = ?",productSn) != null;        }/*** 根据最大返回数获取最新商品(只包含isMarketable=true的对象,不限分类)* * @param maxResults*            最大返回数* * @return 最新商品集合*/public List<Product> getNewProductList(int maxResults) {//请在这里补充代码/********** Begin *********/String sql = "select * from Product  where isMarketable = ? and isNew = ? order by product.createDate desc limit 0,?";return dao.find(sql,true,true,maxResults);/********** End **********///请务必在完成代码填写后删除该语句!}/*** 根据ProductCategory对象和最大返回数获取此分类下的最新商品(只包含isMarketable=true的对象,包含子分类商品)* * @param productCategory*            商品分类* * @param maxResults*            最大返回数* * @return 此分类下的最新商品集合*/public List<Product> getNewProductList(String  productCategory_id, int maxResults) {String sql =  "" +"select *"+"  from product t" +" where t.ismarketable = ?" +"   and t.isnew = ?" +"   and t.productcategory_id = ?" +" order by t.createdate desc limit 0, ?";return dao.find(sql,true,true,productCategory_id,maxResults);}/*** 根据最大返回数获取所有热卖商品(只包含isMarketable=true的对象,不限分类)* * @param maxResults*            最大返回数* * @return 所有热卖商品集合*/public List<Product> getHotProductList(int maxResults) {String sql = "select * from Product  where isMarketable = ? and isHot = ? order by product.createDate desc limit 0,?";return dao.find(sql,true,true,maxResults);}/*** 根据ProductCategory对象和最大返回数获取此分类下的所有热卖商品(只包含isMarketable=true的对象,包含子分类商品)* * @param productCategory*            商品分类* * @param maxResults*            最大返回数* * @return 此分类下的所有热卖商品集合*/public List<Product> getHotProductList(String productCategory_id, int maxResults) {String sql =  "" +"select *"+"  from product t" +" where t.ismarketable = ?" +"   and t.ishot = ?" +"   and t.productcategory_id = ?" +" order by t.createdate desc limit 0, ?";return dao.find(sql,true,true,productCategory_id,maxResults);}/*** 根据最大返回数获取所有精品商品(只包含isMarketable=true的对象,不限分类)* * @param maxResults*            最大返回数* * @return 所有精品商品集合*/public List<Product> getBestProductList(int maxResults) {String sql = "select * from Product  where isMarketable = ? and isBest = ? order by product.createDate desc limit 0,?";return dao.find(sql,true,true,maxResults);}/*** 根据ProductCategory对象和最大返回数获取此分类下的所有精品商品(只包含isMarketable=true的对象,包含子分类商品)* * @param productCategory*            商品分类*            * @param maxResults*            最大返回数* * @return 此分类下的所有精品商品集合*/public List<Product> getBestProductList(String productCategory_id, int maxResults) {String sql = "" +"select *"+"  from product t" +" where t.ismarketable = ?" +"   and t.isbest = ?" +"   and t.productcategory_id = ?" +" order by t.createdate desc limit 0, ?";return dao.find(sql,true,true,productCategory_id,maxResults);}/*** 根据ProductCategory对象,获取此分类下的所有商品(只包含isMarketable=true的对象,包含子分类商品)* * @param productCategory*            商品分类* * @return 此分类下的所有商品集合*/public List<Product> getProductList(ProductCategory productCategory) {String sql = "select * from  product where isMarketable = ? and productCategory_id =? order by createDate desc";return dao.find(sql,true,productCategory.getStr("id"));}/*** 根据ProductCategory对象、起始结果数、最大结果数,获取此分类下的所有商品(只包含isMarketable=true的对象,包含子分类商品)* * @param productCategory*            商品分类*            * @param firstResult*            起始结果数*            * @param maxResults*            最大结果数* * @return 此分类下的所有商品集合*/public List<Product> getProductList(ProductCategory productCategory, int firstResult, int maxResults) {String sql = "" +"select p.*"+"  from product p, productcategory pc " +" where p.productcategory_id = pc.id " +"   and p.ismarketable = ? " +"   and (pc.path like ?) " +" order by p.createdate desc limit ?,?";return dao.find(sql,true,productCategory.getStr("path") + "%",firstResult,maxResults);}/*** 根据起始结果数、最大结果数,获取所有商品(只包含isMarketable=true的对象)*            * @param firstResult*            起始结果数*            * @param maxResults*            最大结果数* * @return 此分类下的所有商品集合*/public List<Product> getProductList(int firstResult, int maxResults) {String sql = "select * from Product where isMarketable = ? order by createDate desc limit ?,?";return dao.find(sql, true, firstResult, maxResults);}/*** 根据起始日期、结束日期、起始结果数、最大结果数,获取商品集合(只包含isMarketable=true的对象)* * @param beginDate*            起始日期,为null则不限制起始日期*            * @param endDate*            结束日期,为null则不限制结束日期*            * @param firstResult*            起始结果数*            * @param maxResults*            最大结果数* * @return 此分类下的所有商品集合*/public List<Product> getProductList(Date beginDate, Date endDate, int firstResult, int maxResults) {if (beginDate != null && endDate == null) {String sql = "select * from Product where isMarketable = ? and createDate > ? order by createDate desc limit ?,?";return dao.find(sql,true,beginDate,firstResult,maxResults);} else if (endDate != null && beginDate == null) {String sql = "select * from Product  where isMarketable = ? and createDate < ? order by createDate desc limit ?,?";return dao.find(sql, true, endDate, firstResult, maxResults);} else if (endDate != null && beginDate != null) {String sql = "select * from Product where isMarketable = ? and createDate > ? and createDate < ? order by product.createDate desc limit ?,?";return dao.find(sql, true, beginDate, endDate, firstResult, maxResults);} else {String sql = "select *from Product  where isMarketable = ? order by createDate desc limit ?,?";return dao.find(sql, true, firstResult, maxResults);}}public WeightUnit getWeightUnit(){return WeightUnit.values()[getInt("weightUnit")];        }/*** 根据商品图片ID获取商品图片,未找到则返回null* * @param ProductImage*            ProductImage对象*/public ProductImage getProductImage(String productImageId) {List<ProductImage> productImageList = getProductImageList();for (ProductImage productImage : productImageList) {if (StringUtils.equals(productImageId, productImage.getId())) {return productImage;}}return null;}/*** 商品是否缺货*/public boolean getIsOutOfStock() {if (getInt("store") != null && getInt("freezeStore") >= getInt("store")) {return true;} else {return false;}}/*** 获取优惠价格,若member对象为null则返回原价格*/public BigDecimal getPreferentialPrice(Member member) {if (member != null) {BigDecimal preferentialPrice = getBigDecimal("price").multiply(new BigDecimal(member.getMemberRank().getDouble("preferentialScale").toString()).divide(new BigDecimal("100")));return SystemConfigUtil.getPriceScaleBigDecimal(preferentialPrice);} else {return getBigDecimal("price");}}/*** 获取商品图片* @return*/public List<ProductImage> getProductImageList() {String productImageListStore = getStr("productImageListStore");if (StringUtils.isEmpty(productImageListStore)) {return null;}        List<ProductImage> list = JSON.parseArray(productImageListStore, ProductImage.class);         return list;}/*** 设置商品图片* @param productImageList*/public void setProductImageList(List<ProductImage> productImageList) {if (productImageList == null || productImageList.size() == 0) {set("productImageListStore", null);return;}String jsonText = JSON.toJSONString(productImageList);set("productImageListStore", jsonText);}/*** 获取属性* @return*/public Map<String, String> getProductAttributeMap() {String sql = "select * from product_productattributemapstore where product_id = ?";List<ProductAttributeMapStore> productAttributeList = ProductAttributeMapStore.dao.find(sql,getStr("id"));if (productAttributeList != null && productAttributeList.size() > 0){for(ProductAttributeMapStore productAttribute:productAttributeList){productAttributeMapStore.put(productAttribute.getStr("mapkey_id"), productAttribute.getStr("element"));}}return productAttributeMapStore;}/*** 设置商品属性* @param productAttributeMap*/public void setProductAttributeMap(Map<String, String> productAttributeMap) {if (productAttributeMap == null || productAttributeMap.size() == 0) {return;}// 先删除已存的Db.deleteById("product_productattributemapstore", "product_id", getStr("id"));ProductAttributeMapStore productAttribute = new ProductAttributeMapStore();for (Entry<String, String> entry: productAttributeMap.entrySet()) {productAttribute.set("product_id", getStr("id"));productAttribute.set("mapkey_id", entry.getKey());productAttribute.set("element", entry.getValue());productAttribute.save();}}/*** 收藏夹* @return*/public List<MemberProduct> getFavoriteMemberList(){String sql ="select * from member_product where favoriteProductSet_id = ?";return MemberProduct.dao.find(sql,getStr("id"));        }/*** 订单项* @return*/public List<OrderItem> getOrderItemList() {String sql = "select * from orderitem t where t.product_id = ?";return OrderItem.dao.find(sql,getStr("id"));}/*** 购物车项* @return*/public List<CartItem> getCartItemList() {String sql = "select * from cartitem t where t.product_id = ?";return CartItem.dao.find(sql,getStr("id"));}/*** 物流项* @return*/public List<DeliveryItem> getDeliveryItemList() {String sql = "select * from deliveryitem t where t.product_id = ?";return DeliveryItem.dao.find(sql,getStr("id"));}/*** 商品属性存储* @return*/public List<ProductAttributeMapStore> getProductAttributeMapStore() {String sql = "select * from product_productattributemapstore t where t.product_id = ?";return ProductAttributeMapStore.dao.find(sql,getStr("id"));}/*** 获取商品库存报警数*            * @return 商品库存报警数*/public Long getStoreAlertCount() {String sql = "select count(*) from Product  where isMarketable = ? and store - freezeStore <= ?";return Db.queryLong(sql, true, SystemConfigUtil.getSystemConfig().getStoreAlertCount());}/*** 获取已上架商品数*            * @return 已上架商品数*/public Long getMarketableProductCount() {String sql = "select count(*) from Product  where isMarketable = ?";return Db.queryLong(sql,true);}/*** 获取已下架商品数*            * @return 已下架商品数*/public Long getUnMarketableProductCount() {String sql = "select count(*) from Product  where isMarketable = ?";return Db.queryLong(sql,false);}/***  关联处理* @param product* @return*/public boolean delete(Product product) {List<MemberProduct> favoriteMemberList = product.getFavoriteMemberList();if (favoriteMemberList != null && favoriteMemberList.size() > 0) {for (MemberProduct favoriteMember : favoriteMemberList) {favoriteMember.delete();}}List<OrderItem> orderItemList = product.getOrderItemList();if (orderItemList != null && orderItemList.size() > 0) {for (OrderItem orderItem : orderItemList) {orderItem.delete();}}List<DeliveryItem> deliveryItemList = product.getDeliveryItemList();if (deliveryItemList != null && deliveryItemList.size() > 0) {for (DeliveryItem deliveryItem : deliveryItemList) {deliveryItem.delete();}}List<CartItem> cartItemList = product.getCartItemList();if (cartItemList != null && cartItemList.size() > 0) {for (CartItem cartItem : cartItemList) {cartItem.delete();}}List<ProductImage> persistentProductImageList = product.getProductImageList();if (persistentProductImageList != null && persistentProductImageList.size() > 0) {for (ProductImage persistentProductImage : persistentProductImageList) {productImageService.deleteFile(persistentProductImage);}}// 先删除已存的Db.deleteById("product_productattributemapstore", "product_id", product.getStr("id"));return product.delete();}
}

第五关

package com.jfinalshop.controller.admin;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.jfinal.aop.Before;
import com.jfinal.aop.Clear;
import com.jfinal.core.Controller;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;
import com.jfinalshop.bean.SystemConfig;
import com.jfinalshop.interceptor.AdminInterceptor;
import com.jfinalshop.model.Admin;
import com.jfinalshop.security.ShiroUtils;
import com.jfinalshop.util.CommonUtil;
import com.jfinalshop.util.SQLUtil;
import com.jfinalshop.util.SystemConfigUtil;
/*** 后台类 - 管理中心基类* 继承此类的子类具备基本的CRUD* */
@Before(AdminInterceptor.class)
public class BaseAdminController <M extends Model<M>> extends Controller {public static final String STATUS = "status";public static final String WARN = "warn";public static final String SUCCESS = "success";public static final String ERROR = "error";public static final String MESSAGE = "message";public static final String CONTENT = "content";protected String id;protected String[] ids;protected String redirectionUrl = "redirectionUrl";// 操作提示后的跳转URL,为null则返回前一页// 排序方式public enum OrderType{asc, desc}private String property;// 查找属性名称private String keyword;// 查找关键字private String orderBy;// 排序字段private String orderType;// 排序方式public BaseAdminController() {// 把class的变量保存起来,不用每次去取this.setModelClass(getClazz());}/*** 获取M的class* * @return M*/@SuppressWarnings("unchecked")public Class<M> getClazz() {Type t = getClass().getGenericSuperclass();Type[] params = ((ParameterizedType) t).getActualTypeArguments();return (Class<M>) params[0];}protected Class<M> modelClass;public Class<M> getModelClass() {return modelClass;}public void setModelClass(Class<M> modelClass) {this.modelClass = modelClass;}/*** 通用分页查找*/public void findByPage() {//请在这里补充代码/********** Begin *********/String select = "select *";String sqlExceptSelect = "from " + getModelClass().getSimpleName() + " where 1 = 1 ";if (StrKit.notBlank(getProperty()) && StrKit.notBlank(getKeyword())) {sqlExceptSelect += "and " + getProperty() + " like '%" + SQLUtil.decodeSpecialCharsWhenLikeUseBackslash(getKeyword()) + "%'";}sqlExceptSelect += " order by createDate desc ";Page<M> pager = getModel(getModelClass()).paginate(getParaToInt("pageNumber", 1), getParaToInt("pageSize", 10), select, sqlExceptSelect);setAttr("pager", pager);setAttr("keyword", getKeyword());//回传回去,供页面显示/********** End **********/}/*** 通用查找全部*/public void getAll() {renderJson(Db.find("select * from " + getModelClass().getSimpleName() + " order by id asc;"));}/*** 通用根据id查找*/public void getById() {renderJson(Db.findById(getModelClass().getSimpleName(), getParaToInt("id")));}/*** 通用新增* */public void saved(Model<M> model){model.set("id", CommonUtil.getUUID());model.set("createDate", new Date());model.save();}/*** 通用修改* */public void updated(Model<M> model){model.set("modifyDate", new Date());model.update();}/*** 通用删除* * @throws Exception*/public void delete() throws Exception {renderText(getModel(getModelClass()).delete() + "");}// 获取系统配置信息public SystemConfig getSystemConfig() {return SystemConfigUtil.getSystemConfig();}public void renderSuccessMessage(String message, String url) {setAttr(MESSAGE, message);setAttr(redirectionUrl, getRequest().getContextPath() + url);render("/admin/success.html");}@Clearpublic void renderErrorMessage(String message) {setAttr("errorMessages", message);setAttr("systemConfig", SystemConfigUtil.getSystemConfig());setAttr("base", getRequest().getContextPath());render("/admin/error.html");}// 输出JSON成功消息,返回nullpublic void ajaxJsonSuccessMessage(String message) {setAttr(STATUS, SUCCESS);setAttr(MESSAGE, message);renderJson();}// 输出JSON错误消息,返回nullpublic void ajaxJsonErrorMessage(String message) {setAttr(STATUS, ERROR);setAttr(MESSAGE, message);renderJson();}// 输出JSON警告消息,返回nullpublic void ajaxJsonWarnMessage(String message) {Map<String, String> jsonMap = new HashMap<String, String>();jsonMap.put(STATUS, WARN);jsonMap.put(MESSAGE, message);renderJson(jsonMap);}public void addActionError(String error){setAttr("errorMessages", error);render("/admin/error.html");    }/*** 根据表名、属性名称、属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).* * @param tableName*            表名* @param propertyName*            属性名称* @param value*            属性值* @return boolean*/public boolean isUnique(String tableName,String propertyName, String value) {        if (StrKit.notBlank(tableName) && StrKit.notBlank(propertyName) && StrKit.notBlank(value)) {String sql = "select * from " + tableName + " where " + propertyName + " = ? ";return Db.findFirst(sql,value) == null;}else{return false;}        }/*** 获取当前登录管理员(从数据库中加载),若未登录则返回null.* * @return 当前登录管理员对象*/public Admin loadLoginAdmin(){Admin admin = ShiroUtils.getLoginAdmin();if (admin == null) {return null;} else {return Admin.dao.findById(admin.getStr("id"));}}/*** 获取当前登录管理员,若未登录则返回null.* * @return 当前登录管理员名称*/public String getLoginAdminName() {String loginAdminName = ShiroUtils.getLoginAdminName();if (StrKit.isBlank(loginAdminName)) {return null;} else {return loginAdminName;}}/*** 获取当前登录管理员,若未登录则返回null.* * @return 当前登录管理员ID*/public String getLoginAdminId(){String loginAdminId = ShiroUtils.getLoginAdminId();if(StrKit.isBlank(loginAdminId)) {return null;} else {return loginAdminId;}}public String getProperty() {property = getPara("property","");return property;}public String getKeyword() {keyword = getPara("keyword","");return keyword;}public String getOrderBy() {orderBy = getPara("orderBy","createDate");return orderBy;}public String getOrderType() {orderType = getPara("orderType",OrderType.desc.name());return orderType;}
}

第六关

package com.jfinalshop.controller.admin;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import com.jfinal.aop.Before;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinal.upload.UploadFile;
import com.jfinalshop.bean.ProductImage;
import com.jfinalshop.bean.SystemConfig;
import com.jfinalshop.bean.SystemConfig.PointType;
import com.jfinalshop.model.Brand;
import com.jfinalshop.model.OrderItem;
import com.jfinalshop.model.Orders.OrderStatus;
import com.jfinalshop.model.Product;
import com.jfinalshop.model.Product.WeightUnit;
import com.jfinalshop.model.ProductAttribute;
import com.jfinalshop.model.ProductAttribute.AttributeType;
import com.jfinalshop.model.ProductCategory;
import com.jfinalshop.model.ProductType;
import com.jfinalshop.service.HtmlService;
import com.jfinalshop.service.ProductImageService;
import com.jfinalshop.util.SerialNumberUtil;
import com.jfinalshop.validator.admin.ProductValidator;
/*** 后台类 - 商品 * */
public class ProductController extends BaseAdminController<Product>{private List<UploadFile> productImages;private String[] productImageParameterTypes;private String[] productImageIds;private Product product = new Product();Map<String, String> productAttributeMap = new HashMap<String, String>();// 列表public void list() {findByPage();render("/admin/product_list.html");}// 添加public void add() {setAttr("productCategoryTreeList", getProductCategoryTreeList());setAttr("allBrand", getAllBrand());setAttr("allWeightUnit", getAllWeightUnit());setAttr("allProductType", getAllProductType());render("/admin/product_input.html");}public void getProduct() {String select = "select * ";String sqlExceptSelect = " from product ";Page<Product> product = Product.dao.paginate(1, 20, select, sqlExceptSelect);Map<String, Object> map = new HashMap<String, Object>();map.put("page", product.getPageNumber());map.put("total", product.getTotalPage()); map.put("records", product.getTotalRow());map.put("rows", product.getList());        renderJson(map);}public void findProduct() {// 获取请求次数int draw = getParaToInt("draw", 0);// 数据起始位置int start = getParaToInt("start", 0);// 数据长度int pageSize = getParaToInt("length", 10);// 页码int pageNumber = 1;if (0 < start) {pageNumber = (start / pageSize) + 1;}//定义列名String[] cols = {"productSn", "name", "price", "isMarketable", "isBest", "isNew", "isHot", "store", "modifyDate"};//获取客户端需要那一列排序int orderColumn = getParaToInt("order[0][column]", 0);String orderName = cols[orderColumn];//获取排序方式 默认为ascString orderDir = getPara("order[0][dir]", "asc");//获取用户过滤框里的字符String searchValue = getPara("search[value]", "");String select = "select * ";String sqlExceptSelect = " from product ";// 全局搜索if (StrKit.notBlank(searchValue)) {sqlExceptSelect += " where ";List<String> sArray = new ArrayList<String>();for (String col : cols) {sArray.add(col + " like '%" + searchValue + "%'");}for (int i = 0; i < sArray.size() - 1; i++) {sqlExceptSelect += sArray.get(i) + " or ";}sqlExceptSelect += sArray.get(sArray.size() - 1);}        // 排序if (StrKit.notBlank(orderName) && StrKit.notBlank(orderDir)) {sqlExceptSelect += " order by " + orderName + " " + orderDir; // 排序} else {sqlExceptSelect += " order by createDate desc "; // 默认排序}Page<Product> product = Product.dao.paginate(pageNumber, pageSize, select, sqlExceptSelect);Map<String, Object> map = new HashMap<String, Object>();map.put("draw", draw);map.put("data", product.getList());map.put("recordsFiltered", product.getTotalRow());  //过滤后记录数map.put("recordsTotal", product.getTotalRow()); //总记录数renderJson(map);}// 编辑public void edit() {String id = getPara("id","");if(StrKit.notBlank(id)){setAttr("product", Product.dao.findById(id));}setAttr("productCategoryTreeList", getProductCategoryTreeList());setAttr("allBrand", getAllBrand());setAttr("allWeightUnit", getAllWeightUnit());setAttr("allProductType", getAllProductType());render("/admin/product_input.html");}// 保存@Before(ProductValidator.class)public void save() {productImages = getFiles();product = getModel(Product.class);String weightUnit = getPara("weightUnit","");if (StrKit.notBlank(weightUnit)){product.set("weightUnit", WeightUnit.valueOf(weightUnit).ordinal());}if (product.getBigDecimal("price").compareTo(new BigDecimal("0")) < 0) {addActionError("销售价不允许小于0");return;}if (product.getBigDecimal("marketPrice").compareTo(new BigDecimal("0")) < 0) {addActionError("市场价不允许小于0");return;}if (product.getDouble("weight") < 0) {addActionError("商品重量只允许为正数或零!");return;}// 参照已经给出的代码,对所填商品信息的『货号』做合法性验证// 请在这里补充代码/********** Begin *********/if (StringUtils.isNotEmpty(product.getStr("productSn"))) {if (Product.dao.isExist(product.getStr("productSn"))) {addActionError("货号重复,请重新输入!");return;}} else {String productSn = SerialNumberUtil.buildProductSn();product.set("productSn",productSn);}/********** End **********/if (getSystemConfig().getPointType() == PointType.productSet) {if (product.get("point") == null) {addActionError("积分不允许为空!");return;}} else {product.set("point",0);}// 处理上传的图片if (productImages != null && productImages.size() > 0) {String allowedUploadImageExtension = getSystemConfig().getAllowedUploadImageExtension().toLowerCase();if (StringUtils.isEmpty(allowedUploadImageExtension)) {addActionError("不允许上传图片文件!");return;}for(int i = 0; i < productImages.size(); i ++) {File images = productImages.get(i).getFile();String productImageExtension =  StringUtils.substringAfterLast(images.getName(), ".").toLowerCase();String[] imageExtensionArray = allowedUploadImageExtension.split(SystemConfig.EXTENSION_SEPARATOR);if (!ArrayUtils.contains(imageExtensionArray, productImageExtension)) {addActionError("只允许上传图片文件类型: " + allowedUploadImageExtension + "!");return;}if (getSystemConfig().getUploadLimit() != 0 && images.length() > getSystemConfig().getUploadLimit() * 1024) {addActionError("此上传文件大小超出限制!");return;}}}List<ProductImage> productImageList = new ArrayList<ProductImage>();// 请参照update方法体中对应功能模块,处理productImageList// 请在这里补充代码/********** Begin *********/if (productImages != null && productImages.size() > 0) {for(int i = 0; i < productImages.size(); i ++) {ProductImage productImage = ProductImageService.service.buildProductImage(productImages.get(i).getFile());productImageList.add(productImage);}}/********** End **********/product.setProductImageList(productImageList);product.set("freezeStore",0);if (StrKit.notBlank(product.getStr("productType_id"))) {List<ProductAttribute> enabledProductAttributeList = ProductAttribute.dao.getEnabledProductAttributeList(product.getStr("productType_id"));for (ProductAttribute productAttribute : enabledProductAttributeList) {/*** 商品类型不为空时,该商品类型所拥有的商品属性需要做合法性验证* 例如:商品类型『食品酒水』,其下属性包括『生产日期』等,若属性要求非空,则需要做对应的非空验证** 本功能模块复杂度较高,建议参考本关中『update』方法的对应实现*/// 请在这里补充代码/********** Begin *********/String parameterValues = getPara(productAttribute.getStr("id"));if (productAttribute.getBoolean("isRequired") && (parameterValues == null || parameterValues.isEmpty())) {addActionError(productAttribute.getStr("name") + "不允许为空!");return;}AttributeType attributeType = ProductAttribute.dao.findById(productAttribute.getStr("id")).getAttributeType();if (StrKit.notBlank(parameterValues)) {if (attributeType == AttributeType.number) {Pattern pattern = Pattern.compile("^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "只允许输入数字!");return;}}if (attributeType == AttributeType.alphaint) {Pattern pattern = Pattern.compile("[a-zA-Z]+");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "只允许输入字母!");return;}}if (attributeType == AttributeType.date) {Pattern pattern = Pattern.compile("\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "日期格式错误!");return;}}if (attributeType == AttributeType.select || attributeType == AttributeType.checkbox) {List<String> attributeOptionList = productAttribute.getAttributeOptionList();if (!attributeOptionList.contains(parameterValues)) {addActionError("参数错误!");return;}}productAttributeMap.put(productAttribute.getStr("id"), parameterValues);}/********** End **********/}}product.save(product);// 保存产品属性if (productAttributeMap != null && productAttributeMap.size() > 0) {product.setProductAttributeMap(productAttributeMap);}// 生成静态页面if (product.getBoolean("isMarketable")) {// 是否上架HtmlService.service.productContentBuildHtml(product);}redirect("/product/list");}// 更新@SuppressWarnings("unused")@Before(ProductValidator.class)public void update() {productImages = getFiles();product = getModel(Product.class);productImageIds = getParaValues("productImageIds");productImageParameterTypes = getParaValues("productImageParameterTypes");String weightUnit = getPara("weightUnit","");if (StrKit.notBlank(weightUnit)){product.set("weightUnit", WeightUnit.valueOf(weightUnit).ordinal());}            if (product.getBigDecimal("price").compareTo(new BigDecimal("0")) < 0) {addActionError("销售价不允许小于0");return;}        if (product.getBigDecimal("marketPrice").compareTo(new BigDecimal("0")) < 0) {addActionError("市场价不允许小于0");return;}        if (product.getDouble("weight") < 0) {addActionError("商品重量只允许为正数或零!");return;}Product persistent = Product.dao.findById(product.getStr("id"));        if (StringUtils.isNotEmpty(product.getStr("productSn"))) {if (!Product.dao.isExist(product.getStr("productSn"))) {addActionError("货号重复,请重新输入!");return;}} else {String productSn = SerialNumberUtil.buildProductSn();product.set("productSn",productSn);}        if (StrKit.notBlank(product.getStr("productType_id"))) {List<ProductAttribute> enabledProductAttributeList = ProductAttribute.dao.getEnabledProductAttributeList(product.getStr("productType_id"));for (ProductAttribute productAttribute : enabledProductAttributeList) {String parameterValues = getPara(productAttribute.getStr("id"));if (productAttribute.getBoolean("isRequired") && (parameterValues == null || parameterValues.isEmpty())) {addActionError(productAttribute.getStr("name") + "不允许为空!");return;}AttributeType attributeType = ProductAttribute.dao.findById(productAttribute.getStr("id")).getAttributeType();if (StrKit.notBlank(parameterValues)) {if (attributeType == AttributeType.number) {Pattern pattern = Pattern.compile("^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)(?:\\.\\d+)?");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "只允许输入数字!");return;}}if (attributeType == AttributeType.alphaint) {Pattern pattern = Pattern.compile("[a-zA-Z]+");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "只允许输入字母!");return;}}if (productAttribute.getAttributeType() == AttributeType.date) {Pattern pattern = Pattern.compile("\\d{4}[\\/-]\\d{1,2}[\\/-]\\d{1,2}");Matcher matcher = pattern.matcher(parameterValues);if (!matcher.matches()) {addActionError(productAttribute.getStr("name") + "日期格式错误!");return;}}if (productAttribute.getAttributeType() == AttributeType.select || productAttribute.getAttributeType() == AttributeType.checkbox) {List<String> attributeOptionList = productAttribute.getAttributeOptionList();if (!attributeOptionList.contains(parameterValues)) {addActionError("参数错误!");return;}}productAttributeMap.put(productAttribute.getStr("id"), parameterValues);}}} if (productImages != null && productImages.size() > 0) {String allowedUploadImageExtension = getSystemConfig().getAllowedUploadImageExtension().toLowerCase();if (StringUtils.isEmpty(allowedUploadImageExtension)) {addActionError("不允许上传图片文件!");return;}for(int i = 0; i < productImages.size(); i ++) {File images = productImages.get(i).getFile();String productImageExtension =  StringUtils.substringAfterLast(images.getName(), ".").toLowerCase();String[] imageExtensionArray = allowedUploadImageExtension.split(SystemConfig.EXTENSION_SEPARATOR);if (!ArrayUtils.contains(imageExtensionArray, productImageExtension)) {addActionError("只允许上传图片文件类型: " + allowedUploadImageExtension + "!");return;}if (getSystemConfig().getUploadLimit() != 0 && images.length() > getSystemConfig().getUploadLimit() * 1024) {addActionError("此上传文件大小超出限制!");return;}}}List<ProductImage> productImageList = new ArrayList<ProductImage>();if (productImageParameterTypes != null && productImageParameterTypes.length > 0) {int index = 0;int productImageFileIndex = 0;int productImageIdIndex = 0;for (String parameterType : productImageParameterTypes) {if (StringUtils.equalsIgnoreCase(parameterType, "productImageFile")) {ProductImage destProductImage = ProductImageService.service.buildProductImage(productImages.get(productImageFileIndex).getFile());productImageList.add(destProductImage);productImageFileIndex ++;index ++;} else if (StringUtils.equalsIgnoreCase(parameterType, "productImageId")) {ProductImage destProductImage = persistent.getProductImage(productImageIds[productImageIdIndex]);productImageList.add(destProductImage);productImageIdIndex ++;index ++;}}}if (product.getBrand() == null || StringUtils.isEmpty(product.getBrand().getStr("id"))) {product.set("brand_id", null);}if (getSystemConfig().getPointType() == PointType.productSet) {if (product.get("point") == null) {addActionError("积分不允许为空!");return;}} else {product.set("point",0);}if (product.get("store") == null) {product.set("freezeStore",0);} else {product.set("freezeStore",persistent.getInt("freezeStore"));}List<ProductImage> persistentProductImageList = persistent.getProductImageList();if (persistentProductImageList != null && persistentProductImageList.size() > 0) {for (ProductImage persistentProductImage : persistentProductImageList) {if (!productImageList.contains(persistentProductImage)) {ProductImageService.service.deleteFile(persistentProductImage);}}}// 产品图片地址if (productImageList != null) {//TODO: SUN.AO && productImageList.size() > 0  当没有图片对象时表示删除了所有的图片product.setProductImageList(productImageList);}// 保存产品属性if (productAttributeMap != null && productAttributeMap.size() > 0) {product.setProductAttributeMap(productAttributeMap);}            updated(product);// 生成静态页面if (product.getBoolean("isMarketable")) {// 是否上架HtmlService.service.productContentBuildHtml(persistent);}        redirect("/product/list");}// 删除public void delete() {ids = getParaValues("ids");if (ids != null && ids.length > 0) {for (String id : ids) {Product product = Product.dao.findById(id);List<OrderItem> orderItemList = product.getOrderItemList();if (orderItemList != null && orderItemList.size() > 0) {for (OrderItem orderItem : orderItemList) {if (orderItem.getOrder().getOrderStatus() != OrderStatus.completed && orderItem.getOrder().getOrderStatus() != OrderStatus.invalid) {ajaxJsonErrorMessage("商品[" + product.getStr("name") + "]订单处理未完成,删除失败!");return;}}}if (Product.dao.delete(product)) {ajaxJsonSuccessMessage("删除成功!");} else {ajaxJsonErrorMessage("删除失败!");}}}}// 获取所有商品类型public List<ProductType> getAllProductType() {return ProductType.dao.getAll();}// 获取所有品牌public List<Brand> getAllBrand() {return Brand.dao.getAll();}// 获取所有重量单位public List<WeightUnit> getAllWeightUnit() {List<WeightUnit> allWeightUnit = new ArrayList<WeightUnit>();for (WeightUnit weightUnit : WeightUnit.values()) {allWeightUnit.add(weightUnit);}return allWeightUnit;}// 获取商品分类树public List<ProductCategory> getProductCategoryTreeList() {return ProductCategory.dao.getProductCategoryTreeList();}
}

第七关

package com.jfinalshop.controller.shop;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.route.ControllerBind;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.Page;
import com.jfinalshop.controller.shop.BaseShopController.OrderType;
import com.jfinalshop.interceptor.NavigationInterceptor;
import com.jfinalshop.model.Product;
import com.jfinalshop.model.ProductCategory;
/*** 前台类 - 商品* */
@ControllerBind(controllerKey = "/shop/product")
@Before(NavigationInterceptor.class)
public class ProductController extends Controller {private ProductCategory productCategory;private String orderType;// 排序类型private String viewType;// 查看类型private List<Product> bestProductList;private List<Product> hotProductList;private List<Product> newProductList;private List<ProductCategory> pathList;private Page<Product> pager;// 列表public void list() {String productCategory_id = getPara("id","");orderType = getPara("orderType","");viewType = getPara("viewType","");int pageNumber = getParaToInt("pageNumber",1);int pageSize = getParaToInt("pageSize",Product.DEFAULT_PRODUCT_LIST_PAGE_SIZE);if(StrKit.notBlank(productCategory_id)){productCategory = ProductCategory.dao.findById(productCategory_id);}        if (productCategory == null){addActionError("未找到内容");return;}                        bestProductList = Product.dao.getBestProductList(productCategory_id, Product.MAX_BEST_PRODUCT_LIST_COUNT);hotProductList = Product.dao.getHotProductList(productCategory_id, Product.MAX_HOT_PRODUCT_LIST_COUNT);newProductList = Product.dao.getNewProductList(productCategory_id, Product.MAX_NEW_PRODUCT_LIST_COUNT);pathList = ProductCategory.dao.getProductCategoryPathList(productCategory);if (StringUtils.equalsIgnoreCase(orderType, "priceAsc")) {pager = Product.dao.categorySearch(pageNumber, pageSize,productCategory,"price",OrderType.asc);} else if (StringUtils.equalsIgnoreCase(orderType, "priceDesc")) {pager = Product.dao.categorySearch(pageNumber, pageSize,productCategory,"price",OrderType.desc);} else if (StringUtils.equalsIgnoreCase(orderType, "dateAsc")) {pager = Product.dao.categorySearch(pageNumber, pageSize,productCategory,"p.createDate",OrderType.asc);} else {pager = Product.dao.categorySearch(pageNumber, pageSize,productCategory,"p.createDate",OrderType.desc);}setAttr("pager", pager);setAttr("productCategory", productCategory);setAttr("rootProductCategoryList", getRootProductCategoryList());setAttr("hotProductList", hotProductList);setAttr("bestProductList", bestProductList);setAttr("newProductList", newProductList);setAttr("pathList", pathList);setAttr("orderType", orderType);setAttr("pageSize", pageSize);if (StringUtils.equalsIgnoreCase(viewType, "tableType")) {render("/shop/product_table_list.html");} else {render("/shop/product_picture_list.html");}}// 搜索public void search() {String keyword = getPara("keyword","");orderType = getPara("orderType","");viewType = getPara("viewType","");int pageNumber = getParaToInt("pageNumber",1);int pageSize = getParaToInt("pageSize",Product.DEFAULT_PRODUCT_LIST_PAGE_SIZE);bestProductList = Product.dao.getBestProductList(Product.MAX_BEST_PRODUCT_LIST_COUNT);hotProductList = Product.dao.getHotProductList(Product.MAX_HOT_PRODUCT_LIST_COUNT);newProductList = Product.dao.getNewProductList(Product.MAX_NEW_PRODUCT_LIST_COUNT);//根据不同的排序方法,生成搜索结果分页对象//请在这里补充代码,完成本方法/********** Begin *********/if (StringUtils.equalsIgnoreCase(orderType, "priceAsc")) {pager = Product.dao.search(pageNumber, pageSize,keyword,"price",OrderType.asc);} else if (StringUtils.equalsIgnoreCase(orderType, "priceDesc")) {pager = Product.dao.search(pageNumber, pageSize,keyword,"price",OrderType.desc);} else if (StringUtils.equalsIgnoreCase(orderType, "dateAsc")) {pager = Product.dao.search(pageNumber, pageSize,keyword,"createDate",OrderType.asc);} else {pager = Product.dao.search(pageNumber, pageSize,keyword,"createDate",OrderType.desc);}/********** End **********/setAttr("pager", pager);setAttr("rootProductCategoryList", ProductCategory.dao.getRootProductCategoryList());setAttr("hotProductList", hotProductList);setAttr("bestProductList", bestProductList);setAttr("newProductList", newProductList);setAttr("keyword", keyword);//TODO:SUN.AO将搜索的关键词再返回到前台setAttr("orderType", orderType);setAttr("pageSize", pageSize);if (StringUtils.equalsIgnoreCase(viewType, "tableType")) {render("/shop/product_table_search.html");} else {render("/shop/product_picture_search.html");}}public List<ProductCategory> getRootProductCategoryList() {return ProductCategory.dao.getRootProductCategoryList();}public void addActionError(String error){setAttr("errorMessages", error);render("/shop/error.html");    }}

项目实践

应该是域名过期了,坐不了。

Python文件之CSV模块读写文件

import csv########## Begin ##########
# 读取 csv 文件的数据,统计每天的销量
total_sales = 0
path = input()
# 打开 csv 文件
with open(path, "r", newline="") as csvfile:# 创建 csv reader 对象reader = csv.reader(csvfile)# 跳过标题行next(reader)# 遍历每一行数据for row in reader:# 将销量转换为整数并累加total_sales += int(row[1])# 打印总销量
print(f"总销量为{total_sales}")
########## End ##########

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com