1. 获取代码:
添加博主微信获取,备注来源:
mryang511688
2. 项目描述
基于SSM框架开发的企业物流(快递)配送管理平台。
3.功能简介
4. 技术栈:
Jsp + SSM + MySQL + LayUI + Bootstrap
5. 运行环境
IntelliJ IDEA/Eclipse + MySQL5.7+ JDK1.8 + Maven3.5.4 + Tomcat9.0
6.前台界面
7. 后台界面
8. 代码展示
- 8.1 货物的实体类
package cn.javabs.logistics.entity.common;
import java.math.BigDecimal;
import org.springframework.stereotype.Component;
import cn.javabs.logistics.entity.admin.Enterprise;
import cn.javabs.logistics.entity.admin.GoodsType;
/**
* 货物实体类
*
* @author Mryang
*
*/
@Component
public class Goods {
public static final int NAME_MAX_LENGTH = 18;// 名称最大长度
public static final int AMOUNT_MAX_VALUE = 1000000;// 可出售数量最大值
public static final int ADDRESS_MAX_LENGTH = 50;// 地址最大长度
public static final int SYNOPSIS_MAX_LENGTH = 50;// 简介最大长度
public static final int NOT_SELLING = 0;// 暂停售卖
public static final int IS_SELLING = 1;// 正在售卖
private Long id;// id
private String name;// 名称
private String number;// 编号
private Long goodsTypeId;// 货物类型id
private int amount;// 可出售数量
private int waitingQuantity = 0;// 待发货数量
private BigDecimal price;// 售价
private Long enterpriseId;// 企业id
private int status;// 状态
private String photo;// 图片
private String address;// 发货地址
private String synopsis;// 简介
private GoodsType goodsType;// 分类
private Enterprise enterprise;// 企业
private String details;// 详情
public String getDetails() {
return details;
}
public void setDetails(String details) {
this.details = details;
}
public Enterprise getEnterprise() {
return enterprise;
}
public void setEnterprise(Enterprise enterprise) {
this.enterprise = enterprise;
}
public GoodsType getGoodsType() {
return goodsType;
}
public void setGoodsType(GoodsType goodsType) {
this.goodsType = goodsType;
}
public String getSynopsis() {
return synopsis;
}
public void setSynopsis(String synopsis) {
this.synopsis = synopsis;
}
public String getPhoto() {
return photo;
}
public void setPhoto(String photo) {
this.photo = photo;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Long getGoodsTypeId() {
return goodsTypeId;
}
public void setGoodsTypeId(Long goodsTypeId) {
this.goodsTypeId = goodsTypeId;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public int getWaitingQuantity() {
return waitingQuantity;
}
public void setWaitingQuantity(int waitingQuantity) {
this.waitingQuantity = waitingQuantity;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Long getEnterpriseId() {
return enterpriseId;
}
public void setEnterpriseId(Long enterpriseId) {
this.enterpriseId = enterpriseId;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Goods [id=" + id + ", name=" + name + ", number=" + number + ", goodsTypeId=" + goodsTypeId
+ ", amount=" + amount + ", waitingQuantity=" + waitingQuantity + ", price=" + price + ", enterpriseId="
+ enterpriseId + ", status=" + status + ", photo=" + photo + ", address=" + address + ", synopsis="
+ synopsis + ", goodsType=" + goodsType + ", enterprise=" + enterprise + "]";
}
}
- 8.2 货物的controller控制器
package cn.javabs.logistics.controller.admin;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cn.javabs.logistics.bean.LoginTypeEnum;
import cn.javabs.logistics.bean.PrefixEnum;
import cn.javabs.logistics.entity.admin.Enterprise;
import cn.javabs.logistics.entity.common.Goods;
import cn.javabs.logistics.page.admin.Page;
import cn.javabs.logistics.service.admin.EnterpriseService;
import cn.javabs.logistics.service.admin.GoodsTypeService;
import cn.javabs.logistics.service.common.GoodsService;
import cn.javabs.logistics.util.StringUtil;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("/admin/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@Autowired
private GoodsTypeService goodsTypeService;
@Autowired
private EnterpriseService enterpriseService;
/**
* 列表页面
*
* @param model
* @return
*/
@RequestMapping(value = "/list", method = RequestMethod.GET)
public ModelAndView list(ModelAndView model, HttpServletRequest request) {
Map<String, Object> queryMap = new HashMap<String, Object>();
model.addObject("goodsTypeList", goodsTypeService.findList(queryMap));
Object loginType = request.getSession().getAttribute("loginType");
if ((Integer) loginType == LoginTypeEnum.ENTERPRISE.getCode()) {
Enterprise loginEnterprise = (Enterprise) request.getSession().getAttribute("admin");
Enterprise enterprise = enterpriseService.findById(loginEnterprise.getId());
model.addObject("address", enterprise.getAddress());
} else {
model.addObject("address", "");
}
model.setViewName("goods/list");
return model;
}
/**
* 获取列表
*
* @param page
* @param name
* @return
*/
@RequestMapping(value = "/list", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getList(Page page, HttpServletRequest request,
@RequestParam(name = "name", required = false, defaultValue = "") String name,
@RequestParam(name = "number", required = false, defaultValue = "") String number,
@RequestParam(name = "goodsTypeId", required = false) Long goodsTypeId) {
Map<String, Object> ret = new HashMap<>();
Map<String, Object> queryMap = new HashMap<String, Object>();
Object loginType = request.getSession().getAttribute("loginType");
if ((Integer) loginType == LoginTypeEnum.ENTERPRISE.getCode()) {
Enterprise enterprise = (Enterprise) request.getSession().getAttribute("admin");
queryMap.put("enterpriseId", enterprise.getId());
}
queryMap.put("name", name);
queryMap.put("number", number);
queryMap.put("goodsTypeId", goodsTypeId);
queryMap.put("offset", page.getOffset());
queryMap.put("pageSize", page.getRows());
ret.put("rows", goodsService.findList(queryMap));
ret.put("total", goodsService.getTotal(queryMap));
return ret;
}
/**
* 添加货物
*
* @param goods
* @param request
* @return
*/
@RequestMapping(value = "/add", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> add(Goods goods, HttpServletRequest request) {
Map<String, String> ret = new HashMap<String, String>();
Object loginType = request.getSession().getAttribute("loginType");
if ((Integer) loginType != LoginTypeEnum.ENTERPRISE.getCode()) {
ret.put("type", "error");
ret.put("msg", "请登录企业用户!");
return ret;
}
if (judge(goods, ret)) {
return ret;
}
if (goods.getAmount() < 1 || goods.getAmount() > Goods.AMOUNT_MAX_VALUE) {
ret.put("type", "error");
ret.put("msg", "数量需在1~" + Goods.AMOUNT_MAX_VALUE + "之间!");
return ret;
}
Enterprise enterprise = (Enterprise) request.getSession().getAttribute("admin");
goods.setEnterpriseId(enterprise.getId());
String number = StringUtil.generateSn(PrefixEnum.GOODS.getValue());
goods.setNumber(number);
if (goodsService.add(goods) <= 0) {
ret.put("type", "error");
ret.put("msg", "添加失败!");
return ret;
}
ret.put("type", "success");
ret.put("msg", "添加成功!");
return ret;
}
/**
* 编辑
*
* @param goods
* @return
*/
@RequestMapping(value = "/edit", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> edit(Goods goods, HttpServletRequest request) {
Map<String, String> ret = new HashMap<String, String>();
Object loginType = request.getSession().getAttribute("loginType");
if ((Integer) loginType != LoginTypeEnum.ENTERPRISE.getCode()) {
ret.put("type", "error");
ret.put("msg", "请登录企业用户!");
return ret;
}
if (judge(goods, ret)) {
return ret;
}
if (goodsService.edit(goods) <= 0) {
ret.put("type", "error");
ret.put("msg", "编辑失败!");
return ret;
}
ret.put("type", "success");
ret.put("msg", "编辑成功!");
return ret;
}
/**
* 批量删除
*
* @param ids
* @return
*/
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> delete(String ids) {
Map<String, String> ret = new HashMap<String, String>();
if (StringUtils.isEmpty(ids)) {
ret.put("type", "error");
ret.put("msg", "选择要删除的数据!");
return ret;
}
if (ids.contains(",")) {
ids = ids.substring(0, ids.length() - 1);
}
try {
if (goodsService.delete(ids) <= 0) {
ret.put("type", "error");
ret.put("msg", "删除失败!");
return ret;
}
} catch (Exception e) {
ret.put("type", "error");
ret.put("msg", "所选择数据中有数据存在关联数据,无法删除!");
return ret;
}
ret.put("type", "success");
ret.put("msg", "删除成功!");
return ret;
}
// 判断
private boolean judge(Goods goods, Map<String, String> ret) {
if (goods == null) {
ret.put("type", "error");
ret.put("msg", "请填写正确的信息!");
return true;
}
if (goods.getGoodsTypeId() == null) {
ret.put("type", "error");
ret.put("msg", "请选择分类!");
return true;
}
if (StringUtils.isEmpty(goods.getPhoto())) {
ret.put("type", "error");
ret.put("msg", "请上传货物图片!");
return true;
}
if (StringUtils.isEmpty(goods.getName())) {
ret.put("type", "error");
ret.put("msg", "请填写名称!");
return true;
}
if (goods.getName().length() > Goods.NAME_MAX_LENGTH) {
ret.put("type", "error");
ret.put("msg", "名称最多为" + Goods.NAME_MAX_LENGTH + "位!");
return true;
}
if (StringUtils.isEmpty(goods.getAddress())) {
ret.put("type", "error");
ret.put("msg", "请填写发货地址!");
return true;
}
if (goods.getAddress().length() > Goods.ADDRESS_MAX_LENGTH) {
ret.put("type", "error");
ret.put("msg", "地址最多为" + Goods.ADDRESS_MAX_LENGTH + "位!");
return true;
}
return false;
}
@RequestMapping(value = "/addAmount", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> addAmount(Goods goods) {
Map<String, String> ret = new HashMap<String, String>();
if (goods == null) {
ret.put("type", "error");
ret.put("msg", "请填写正确的信息!");
return ret;
}
if (goods.getAmount() < 1 || goods.getAmount() > Goods.AMOUNT_MAX_VALUE) {
ret.put("type", "error");
ret.put("msg", "数量需在1~" + Goods.AMOUNT_MAX_VALUE + "之间!");
return ret;
}
Goods byId = goodsService.findById(goods.getId());
byId.setAmount(byId.getAmount() + goods.getAmount());
if (goodsService.addAmount(byId) <= 0) {
ret.put("type", "error");
ret.put("msg", "数量添加失败,请联系管理员!");
return ret;
}
ret.put("type", "success");
ret.put("msg", "添加成功!");
return ret;
}
@RequestMapping(value = "/editDetails", method = RequestMethod.POST)
@ResponseBody
public Map<String, String> editDetails(Goods goods) {
Map<String, String> ret = new HashMap<String, String>();
if (goods == null) {
ret.put("type", "error");
ret.put("msg", "请填写正确的信息!");
return ret;
}
if (goodsService.editDetails(goods) <= 0) {
ret.put("type", "error");
ret.put("msg", "详情操作失败!");
return ret;
}
ret.put("type", "success");
ret.put("msg", "操作成功!");
return ret;
}
/**
* 富文本kindedit的图片上传
*
* @param request
* @param response
* @param imgFile
* @throws IOException
*/
@ResponseBody
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public void uploadFile(HttpServletRequest request, HttpServletResponse response,
@RequestParam("imgFile") MultipartFile imgFile) throws IOException {
response.setContentType("application/json; charset=UTF-8");
JSONObject obj = new JSONObject();
/* Map obj = new HashMap<>(); */
obj.put("error", 0);
String massage = null;
PrintWriter out = response.getWriter();
// 判断文件类型是否是图片
String originalFilename = imgFile.getOriginalFilename();
// 获取文件后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1, originalFilename.length());
if (!"jpg,jpeg,gif,png".toUpperCase().contains(suffix.toUpperCase())) {
massage = "图片格式不正确,请选择jpg,jpeg,gif,png格式的图片!";
out.write("图片格式不正确,请选择jpg,jpeg,gif,png格式的图片!");
obj.put("error", 1);
}
if (imgFile.getSize() / 1024 > 1024 * 1024 * 1024) {
massage = "图片大小不能超过10M!";
out.write("图片大小不能超过10M");
obj.put("error", 1);
}
String savePath = request.getServletContext().getRealPath("/") + "/resources/upload/";
// 准备保存文件
File filePath = new File(savePath);
if (!filePath.exists()) {
// 若不存在文件夹,则创建一个文件夹
filePath.mkdir();
}
String filename = new Date().getTime() + "." + suffix;
try {
imgFile.transferTo(new File(savePath + filename));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int error = (Integer) obj.get("error");
if (error == 0) {
obj.put("url", request.getServletContext().getContextPath() + "/resources/upload/" + filename);
} else {
obj.put("message", massage);
}
out.println(obj.toString());
}
}
- 8.3 货物的业务逻辑接口
package cn.javabs.logistics.service.common;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Service;
import cn.javabs.logistics.entity.common.Goods;
import cn.javabs.logistics.entity.common.Orders;
import cn.javabs.logistics.entity.common.Person;
/**
* 货物Service
*/
@Service
public interface GoodsService {
public Goods findById(Long id);// 根据id查找
public int add(Goods goods);// 添加
public int edit(Goods goods);// 编辑
public int delete(String ids);// 删除
public List<Goods> findList(Map<String, Object> queryMap);
public int getTotal(Map<String, Object> queryMap);
public int addAmount(Goods goods);// 添加货物数量
public List<Goods> findSendingList(Map<String, Object> queryMap);// 查询出售中的列表
public int findSendingTotal(Map<String, Object> queryMap);// 查询数量
public int editDetails(Goods goods);// 编辑详情
public int buyGoods(Goods goods, Person person, Orders orders);
}
- 8.4 货物的业务逻辑接口的实现类
package cn.javabs.logistics.service.common.impl;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.javabs.logistics.dao.admin.EnterpriseDao;
import cn.javabs.logistics.dao.common.GoodsDao;
import cn.javabs.logistics.dao.common.OrdersDao;
import cn.javabs.logistics.dao.common.PersonDao;
import cn.javabs.logistics.entity.admin.Enterprise;
import cn.javabs.logistics.entity.common.Goods;
import cn.javabs.logistics.entity.common.Orders;
import cn.javabs.logistics.entity.common.Person;
import cn.javabs.logistics.service.common.GoodsService;
/**
* 货物Service
*/
@Service
public class GoodsServiceImpl implements GoodsService {
@Autowired
private GoodsDao goodsDao;
@Autowired
private PersonDao personDao;
@Autowired
private EnterpriseDao enterpriseDao;
@Autowired
private OrdersDao ordersDao;
@Override
public Goods findById(Long id) {
return goodsDao.findById(id);
}
@Override
public int add(Goods goods) {
return goodsDao.add(goods);
}
@Override
public int edit(Goods goods) {
return goodsDao.edit(goods);
}
@Override
public int delete(String ids) {
return goodsDao.delete(ids);
}
@Override
public List<Goods> findList(Map<String, Object> queryMap) {
return goodsDao.findList(queryMap);
}
@Override
public int getTotal(Map<String, Object> queryMap) {
return goodsDao.getTotal(queryMap);
}
@Override
public int addAmount(Goods goods) {
return goodsDao.addAmount(goods);
}
@Override
public List<Goods> findSendingList(Map<String, Object> queryMap) {
// TODO Auto-generated method stub
return goodsDao.findSendingList(queryMap);
}
@Override
public int findSendingTotal(Map<String, Object> queryMap) {
return goodsDao.findSendingTotal(queryMap);
}
@Override
public int editDetails(Goods goods) {
// TODO Auto-generated method stub
return goodsDao.editDetails(goods);
}
/**
* 购买商品
*
* @param goods
* @param person
* @param order
* @return
*/
@Override
@Transactional
public int buyGoods(Goods goods, Person person, Orders orders) {
// 前台用户修改余额
person.setBalance(person.getBalance().subtract(orders.getPrice()));
personDao.editBalance(person);
// 货物对应的企业修改余额
Enterprise enterprise = enterpriseDao.findById(goods.getEnterpriseId());
enterprise.setBalance(enterprise.getBalance().add(orders.getPrice()));
enterpriseDao.editBalance(enterprise);
ordersDao.add(orders);
goods.setAmount(goods.getAmount() - orders.getQuantity());
goods.setWaitingQuantity(goods.getWaitingQuantity() + orders.getQuantity());
return goodsDao.editAmountAndWaitingQuantity(goods);
}
}
- 8.5 货物的数据持久层的接口
package cn.javabs.logistics.dao.common;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import cn.javabs.logistics.entity.common.Goods;
@Repository
public interface GoodsDao {
public Goods findById(Long id);// 根据id查找
public int add(Goods goods);// 添加
public int edit(Goods goods);// 编辑
public int delete(String ids);// 删除
public List<Goods> findList(Map<String, Object> queryMap);
public int getTotal(Map<String, Object> queryMap);
public int addAmount(Goods goods);// 添加货物数量
public List<Goods> findSendingList(Map<String, Object> queryMap);// 查询出售中货物
public int findSendingTotal(Map<String, Object> queryMap);// 查询数量
public int editDetails(Goods goods);// 编辑详情
public int editAmountAndWaitingQuantity(Goods goods);// 购买后对数量进行修改
public int editWaitingQuantity(Goods goods);// 修改待发货数量
}
- 8.6 货物的数据持久层的接口的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.javabs.logistics.dao.common.GoodsDao">
<!-- 根据id查找 -->
<select id="findById" parameterType="Long" resultType="Goods">
select * from goods where id = #{id}
</select>
<!-- 添加-->
<insert id="add" parameterType="Goods">
insert into goods(id,name,number,goodsTypeId,amount,waitingQuantity,price,enterpriseId,status,photo,address,synopsis)
values(null,#{name},#{number},#{goodsTypeId},#{amount},#{waitingQuantity},#{price},#{enterpriseId},#{status},#{photo},#{address},#{synopsis})
</insert>
<!-- 修改货物数量-->
<update id="addAmount" parameterType="Goods">
update goods set amount = #{amount} where id = #{id}
</update>
<!-- 修改货物待发货数量-->
<update id="editWaitingQuantity" parameterType="Goods">
update goods set waitingQuantity=#{waitingQuantity} where id = #{id}
</update>
<!-- 修改-->
<update id="edit" parameterType="Goods">
update goods set name = #{name},goodsTypeId=#{goodsTypeId},
price = #{price},status= #{status},photo=#{photo},address=#{address},synopsis=#{synopsis} where id = #{id}
</update>
<!-- 修改-->
<update id="editAmountAndWaitingQuantity" parameterType="Goods">
update goods set amount=#{amount},waitingQuantity=#{waitingQuantity} where id = #{id}
</update>
<!-- 修改-->
<update id="editDetails" parameterType="Goods">
update goods set details=#{details} where id = #{id}
</update>
<!-- 删除 -->
<delete id="delete" parameterType="String">
delete from goods where id in(${value})
</delete>
<!-- 分页获取列表 -->
<select id="findList" parameterType="Map" resultType="Goods">
select * from goods where 1 = 1
<if test="name != null">
and name like '%${name}%'
</if>
<if test="goodsTypeId != null">
and goodsTypeId = #{goodsTypeId}
</if>
<if test="number != null">
and number like '%${number}%'
</if>
<if test="enterpriseId != null">
and enterpriseId = #{enterpriseId}
</if>
<if test="offset != null and pageSize != null">
limit #{offset},#{pageSize}
</if>
</select>
<!-- 获取符合结果的总记录数 -->
<select id="getTotal" parameterType="Map" resultType="Integer">
select count(*) from goods where 1 = 1
<if test="name != null">
and name like '%${name}%'
</if>
<if test="enterpriseId != null">
and enterpriseId = ${enterpriseId}
</if>
</select>
<select id="findSendingTotal" parameterType="Map" resultType="Integer">
select count(*)
from goods where 1 = 1
<if test="status != null">
and status = #{status}
</if>
<if test="name != null">
and name like '%${name}%'
</if>
<if test="goodsTypeId != null">
and goodsTypeId = #{goodsTypeId}
</if>
</select>
<select id="findSendingList" parameterType="Map" resultMap="ResultMap">
select g.*,t.name tName,e.username eUsername
from (goods g left join goods_type t on g.goodsTypeId = t.id)
LEFT JOIN enterprise e on g.enterpriseId = e.id where 1 = 1
<if test="status != null">
and g.status = #{status}
</if>
<if test="name != null">
and g.name like '%${name}%'
</if>
<if test="goodsTypeId != null">
and g.goodsTypeId = #{goodsTypeId}
</if>
order by g.id desc
<if test="offset != null and pageSize != null">
limit #{offset},#{pageSize}
</if>
</select>
<resultMap type="Goods" id="ResultMap">
<id property="id" column="id"/>
<result column="name" property="name"/>
<result column="number" property="number"/>
<result column="goodsTypeId" property="goodsTypeId"/>
<result column="amount" property="amount"/>
<result column="price" property="price"/>
<result column="enterpriseId" property="enterpriseId"/>
<result column="photo" property="photo"/>
<result column="address" property="address"/>
<result column="synopsis" property="synopsis"/>
<association property="goodsType" column="goodsType"
javaType="GoodsType" resultMap="goodsTypeResult"/>
<association property="enterprise" column="enterprise"
javaType="Enterprise" resultMap="enterpriseResult"/>
</resultMap>
<resultMap type="GoodsType" id="goodsTypeResult">
<result column="tName" property="name"/>
</resultMap>
<resultMap type="Enterprise" id="enterpriseResult">
<result column="eUsername" property="username"/>
<result column="address" property="address"/>
</resultMap>
</mapper>
作者: 杨校
出处: https://mryang.blog.csdn.net
有意源码研究Wx-Me:mryang511688
分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 如有问题, 可邮件(397583050@qq.com)咨询