SMBMS

数据库:

项目如何搭建?

考虑使用不使用Maven?依赖,Jar

1、项目搭建准备工作

  1. 搭建一个maven web项目

  2. 配置Tomcat

  3. 测试项目是否能够跑起来

  4. 导入项目中会遇到的jar包;

    jsp,Servlet,mysql驱动,jstl,standard...

  5. 创建项目包结构

  6. 编写实体类;

    ORM映射:表-类映射

  7. 编写基础公共类

    1. 数据库配置文件

      driver=com.mysql.cj.jdbc.Driver
      url=jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=UTF-8&useSSL=true&setServiceTime=GMT
      username=root
      password=123456
    2. 编写数据库的公共类

      //操作数据库的公共类
      public class BaseDao {
      private static String driver;
      private static String url;
      private static String username;
      private static String password; //静态代码块,类加载的时候就初始化了
      static {
      Properties properties = new Properties();
      //通过类加载器读取对应的资源
      InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties"); try {
      properties.load(is);
      } catch (IOException e) {
      e.printStackTrace();
      } driver = properties.getProperty("driver");
      url = properties.getProperty("url");
      username = properties.getProperty("username");
      password = properties.getProperty("password");
      }
      //获取数据库的连接
      public static Connection getConnection(){
      Connection connection = null;
      try {
      Class.forName("driver");
      connection = DriverManager.getConnection(url, username, password);
      } catch (Exception e) {
      e.printStackTrace();
      }
      return connection;
      } //编写查询公共类
      public static ResultSet execute(Connection connection,String sql,Object[] params,ResultSet resultSet,PreparedStatement preparedStatement) throws SQLException {
      //预编译的sql,在后面直接执行就可以了
      preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) {
      //setObject,占位符从1开始,但是我们的数组是从0开始!
      preparedStatement.setObject(i+1,params[i]);
      } resultSet = preparedStatement.executeQuery();
      return resultSet;
      } //编写增删改公共方法
      public static int execute(Connection connection, String sql, Object[] params, PreparedStatement preparedStatement) throws SQLException {
      preparedStatement = connection.prepareStatement(sql); for (int i = 0; i < params.length; i++) {
      //setObject,占位符从1开始,但是我们的数组是从0开始!
      preparedStatement.setObject(i+1,params[i]);
      } int updateRows = preparedStatement.executeUpdate();
      return updateRows;
      } //释放资源
      public static boolean closeResource(Connection connection,PreparedStatement preparedStatement,ResultSet resultSet){
      boolean flag = true; if (resultSet!=null){
      try {
      resultSet.close();
      //GC回收
      resultSet = null;
      } catch (SQLException e) {
      e.printStackTrace();
      flag = false;
      }
      } if (preparedStatement!=null){
      try {
      preparedStatement.close();
      //GC回收
      preparedStatement = null;
      } catch (SQLException e) {
      e.printStackTrace();
      flag = false;
      }
      } if (connection!=null){
      try {
      connection.close();
      //GC回收
      connection = null;
      } catch (SQLException e) {
      e.printStackTrace();
      flag = false;
      }
      } return flag;
      }
      }
    3. 编写字符编码过滤器

  8. 导入静态资源

2、登录功能实现

  1. 编写前端页面

  2. 设置首页

    <!--设置欢迎页面-->
    <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
    </welcome-file-list>
  3. 编写dao层得到用户登录的接口

    DAO:data access object

    //得到要登录的用户
    public User getLoginUser(Connection connection,String userCode) throws SQLException;
  4. 编写dao接口的实现类

    public class UserDaoImpl implements UserDao{
    public User getLoginUser(Connection connection, String userCode) throws SQLException { PreparedStatement pstm = null;
    ResultSet rs = null;
    User user = null; if (connection!=null){
    String sql = "select * from smbms_user where userCode=?";
    Object[] params = {userCode}; rs = BaseDao.execute(connection, pstm, rs, sql, params); if (rs.next()){
    user = new User();
    user.setId(rs.getInt("id"));
    user.setUserCode(rs.getString("userCode"));
    user.setUserName(rs.getString("userName"));
    user.setUserPassword(rs.getString("userPassword"));
    user.setGender(rs.getInt("gender"));
    user.setBirthday(rs.getDate("birthday"));
    user.setPhone(rs.getString("phone"));
    user.setAddress(rs.getString("address"));
    user.setUserRole(rs.getInt("userRole"));
    user.setCreatedBy(rs.getInt("createdBy"));
    user.setCreationDate(rs.getTimestamp("creationDate"));
    user.setModifyBy(rs.getInt("modifyBy"));
    user.setModifyDate(rs.getTimestamp("modifyDate"));
    }
    BaseDao.closeResource(null,pstm,rs); } return user;
    }
    }
  5. 业务层接口

    //用户登录
    public User login(String userCode,String password);
  6. 业务层实现类

    public class UserServiceImpl implements UserService {
    
        //业务层都会调用dao层,所以我们要引入Dao层;
    private UserDao userDao; public UserServiceImpl() {
    userDao = new UserDaoImpl();
    } public User login(String userCode, String password) {
    Connection connection = null;
    User user = null; connection = BaseDao.getConnection();
    try {
    user = userDao.getLoginUser(connection, userCode);
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    BaseDao.closeResource(connection, null, null);
    }
    return user;
    }
    }
  7. 编写Servlet

    public class LoginServlet extends HttpServlet {
    
        //Servlet:控制层,调用业务层代码
    
        @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("LoginServlet--start...."); //获取用户名和密码
    String userCode = req.getParameter("userCode");
    String userPassword = req.getParameter("userPassword"); //和数据库中的密码进行对比,调用业务层;
    UserService userService = new UserServiceImpl();
    User user = userService.login(userCode, userPassword); //这里已经把登录的人给查出来了 if (user!=null){ //查有此人,可以登录
    //将用户的信息放到Session中;
    req.getSession().setAttribute(Constants.USER_SESSION,user);
    //跳转到主页
    resp.sendRedirect("jsp/frame.jsp");
    }else {//查无此人,无法登录
    //转发回登录页面,顺带提示它,用户名或者密码错误
    req.setAttribute("error","用户名或者密码不正确");
    req.getRequestDispatcher("login.jsp").forward(req,resp);
    }
    } @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doGet(req, resp);
    }
    }
  8. 注册Servlet

    <!--Servlet-->
    <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.kuang.servlet.user.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
    </servlet-mapping>
  9. 测试访问,确保以上功能成功!

3、登录功能优化

注销功能:

思路:移除Session,返回登录页面

public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//移除用户的Constants.USER_SESSION
req.getSession().removeAttribute(Constants.USER_SESSION);
resp.sendRedirect(req.getContextPath()+"/login.jsp");//返回登录页面
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}

注册xml

<servlet>
<servlet-name>LogoutServlet</servlet-name>
<servlet-class>com.kuang.servlet.user.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LogoutServlet</servlet-name>
<url-pattern>/jsp/logout.do</url-pattern>
</servlet-mapping>

登录拦截优化

编写一个过滤器并注册

public class SysFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp; //过滤器,从Session中获取用户,
User user = (User) request.getSession().getAttribute(Constants.USER_SESSION); if (user==null){ //已经被移除或者注销了,或者未登录
response.sendRedirect("/smbms/error.jsp");
}else {
chain.doFilter(req,resp);
}
} public void destroy() {
}
}
<!--用户登录过滤器-->
<filter>
<filter-name>SysFilter</filter-name>
<filter-class>com.kuang.filter.SysFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SysFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
</filter-mapping>

测试,登录,注销权限,都要保证OK!

4、密码修改

  1. 导入前端素材

    <li><a href="${pageContext.request.contextPath }/jsp/pwdmodify.jsp">密码修改</a></li>
  2. 写项目,建议从底层向上写

  3. UserDao接口

    //修改当前用户密码
    public int updatePwd(Connection connection,int id,int password) throws SQLException;
  4. UserDao接口实现类

    //修改当前用户密码
    public int updatePwd(Connection connection, int id, int password) throws SQLException { PreparedStatement pstm = null;
    int execute = 0;
    if (connection!=null){
    String sql = "update smbms_user set userPassword = ? where id = ?";
    Object params[] = {password,id};
    execute = BaseDao.execute(connection, pstm, sql, params);
    BaseDao.closeResource(null,pstm,null);
    }
    return execute;
    }
  5. UserService层

    //根据用户ID修改密码
    public boolean updatePwd(int id, int pwd);
  6. UserService实现类

    public boolean updatePwd(int id, int pwd) {
    Connection connection = null;
    boolean flag = false;
    //修改密码
    try {
    connection = BaseDao.getConnection();
    if (userDao.updatePwd(connection,id,pwd)>0){
    flag = true;
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }finally {
    BaseDao.closeResource(connection,null,null);
    }
    return flag;
    }
  7. Servlet记得实现复用,需要提取出方法!

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String method = req.getParameter("method");
    if (method.equals("savepwd")&&method!=null){
    this.updatePwd(req, resp);
    }
    } public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
    //从Session里面拿ID;
    Object o = req.getSession().getAttribute(Constants.USER_SESSION);
    String newpassword = req.getParameter("newpassword"); System.out.println("UserServlet"+newpassword); boolean flag = false; //if (o!=null && !StringUtils.isNullOrEmpty(newpassword)){
    if (o!=null && newpassword!=null){
    UserService userService = new UserServiceImpl();
    flag = userService.updatePwd(((User) o).getId(), newpassword);
    if (flag){
    req.setAttribute("message","修改密码成功,请退出,使用新密码登录");
    //密码修改成功,移除当前Session
    req.getSession().removeAttribute(Constants.USER_SESSION);
    }else {
    req.setAttribute("message","密码修改失败");
    //密码修改成功,移除当前Session
    }
    }else {
    req.setAttribute("message","新密码有问题");
    }
    try {
    req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
    } catch (ServletException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    <servlet>
    <servlet-name>UserServlet</servlet-name>
    <servlet-class>com.kuang.servlet.user.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>UserServlet</servlet-name>
    <url-pattern>/jsp/user.do</url-pattern>
  8. 测试

优化密码修改使用Ajax;

  1. 阿里巴巴的fastjson

    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.79</version>
    </dependency>
  2. 后台代码修改

    //修改密码
    public void updatePwd(HttpServletRequest req, HttpServletResponse resp){
    //从Session里面拿ID;
    Object o = req.getSession().getAttribute(Constants.USER_SESSION);
    String newpassword = req.getParameter("newpassword"); System.out.println("UserServlet"+newpassword); boolean flag = false; //if (o!=null && !StringUtils.isNullOrEmpty(newpassword)){
    if (o!=null && newpassword!=null){
    UserService userService = new UserServiceImpl();
    flag = userService.updatePwd(((User) o).getId(), newpassword);
    if (flag){
    req.setAttribute("message","修改密码成功,请退出,使用新密码登录");
    //密码修改成功,移除当前Session
    req.getSession().removeAttribute(Constants.USER_SESSION);
    }else {
    req.setAttribute("message","密码修改失败");
    //密码修改成功,移除当前Session
    }
    }else {
    req.setAttribute("message","新密码有问题");
    }
    try {
    req.getRequestDispatcher("pwdmodify.jsp").forward(req,resp);
    } catch (ServletException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } //验证旧密码,session中有用户的密码
    public void pwdModify(HttpServletRequest req, HttpServletResponse resp){
    //从Session里面拿oldpassword;
    Object o = req.getSession().getAttribute(Constants.USER_SESSION);
    String oldpassword = req.getParameter("oldpassword"); //万能的Map : 结果集
    HashMap<String, String> resultMap = new HashMap<String,String>();
    if (o==null){ //Session失效了,session过期了
    resultMap.put("result","sessionerror");
    }else if (StringUtils.isNullOrEmpty(oldpassword)){ //输入的密码为空
    resultMap.put("result","error");
    }else {
    String userPassword = ((User) o).getUserPassword(); //Session中用户的密码
    if (oldpassword.equals(userPassword)){
    resultMap.put("result","true");
    }else {
    resultMap.put("result","false");
    }
    } try {
    resp.setContentType("application/json");
    PrintWriter writer = resp.getWriter();
    //JSONArray 阿里巴巴的JSON工具类,转换格式
    /*
    resultMap = ["result","sessionerror","result","error"]
    Json格式 = {key:value}
    */
    writer.write(JSONArray.toJSONString(resultMap));
    writer.flush();
    writer.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
  3. 测试

5、用户管理实现

思路:

  1. 导入分页的工具类

  2. 用户列表页面导入

    userlist.jsp

    rollpage.jsp

1、获取用户数量

  1. UserDao

    //根据用户名或者角色查询用户总数
    public int getUserCount(Connection connection,String username,int userRole) throws SQLException;
  2. UserDaoImpl

    //根据用户名或者角色查询用户总数【最难理解的SQL】
    public int getUserCount(Connection connection, String username, int userRole) throws SQLException {
    PreparedStatement pstm = null;
    ResultSet rs = null;
    int count = 0; if (connection!=null){
    StringBuffer sql = new StringBuffer();
    sql.append("select count(1) as count from smbms_user u,smbms_role r where u.userRole = r.id");
    ArrayList<Object> list = new ArrayList<Object>();//存放我们的参数 if (!StringUtils.isNullOrEmpty(username)){ //拼接sql语句
    sql.append(" and u.userName like ?");
    list.add("%"+username+"%"); //index:0
    }
    if (userRole>0){
    sql.append(" and u.userRole = ?");
    list.add(userRole); //index:1
    } //怎么把list转换为数组
    Object[] params = list.toArray(); System.out.println("UserDaoImpl->getUserCount"+sql.toString()); //输出最后完整的SQL语句 rs = BaseDao.execute(connection, pstm, null, sql.toString(), params); if (rs.next()){
    count = rs.getInt("count");//从结果集中获取最终的数量
    }
    BaseDao.closeResource(null,pstm,rs);
    } return count;
    }
  3. UserService

    //查询记录数
    public int getUserCount(String username, int userRole);
  4. UserServiceImpl

    //查询记录数
    public int getUserCount(String username, int userRole) {
    Connection connection = null;
    int count = 0;
    try {
    connection = BaseDao.getConnection();
    count = userDao.getUserCount(connection, username, userRole);
    } catch (SQLException e) {
    e.printStackTrace();
    } finally {
    BaseDao.closeResource(connection,null,null);
    } return count;
    }

2、获取用户列表

  1. userdao

    //通过条件查询-userList
    public List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int pageSize) throws Exception;
  2. userdaoImpl

    public List<User> getUserList(Connection connection, String username, int userRole, int currentPageNo, int pageSize) throws Exception {
    PreparedStatement pstm = null;
    ResultSet rs = null;
    List<User> userList = new ArrayList<User>(); if (connection!=null){
    StringBuffer sql = new StringBuffer();
    sql.append("select u.*,r.roleName as userRoleName from smbms_user u,smbms_role r where u.userRole = r.id");
    List<Object> list = new ArrayList<Object>();//存放我们的参数 if (!StringUtils.isNullOrEmpty(username)){ //拼接sql语句
    sql.append(" and u.userName like ?");
    list.add("%"+username+"%"); //index:0
    }
    if (userRole>0){
    sql.append(" and u.userRole = ?");
    list.add(userRole); //index:1
    } //在数据库中,分页使用 limit startIndex,pageSize; 总数
    //当前页 (当前页-1)*页面大小
    //0,5 1 0 01234
    //5,5 2 5 56789
    //10,5 3 10 sql.append(" order by creationDate DESC limit ?,?");
    currentPageNo = (currentPageNo-1)*pageSize;
    list.add(currentPageNo);
    list.add(pageSize); //怎么把list转换为数组
    Object[] params = list.toArray(); System.out.println("sql-->"+sql.toString()); //输出最后完整的SQL语句 rs = BaseDao.execute(connection, pstm, null, sql.toString(), params); while (rs.next()){
    User user = new User();
    user.setId(rs.getInt("id"));
    user.setUserCode(rs.getString("userCode"));
    user.setUserName(rs.getString("userName"));
    user.setGender(rs.getInt("gender"));
    user.setBirthday(rs.getDate("birthday"));
    user.setPhone(rs.getString("phone"));
    user.setUserRole(rs.getInt("userRole"));
    user.setUserRoleName(rs.getString("userRoleName"));
    userList.add(user);
    }
    BaseDao.closeResource(null,pstm,rs);
    }
    return userList;
    }
  3. userService

    //通过条件查询-userList
    public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize);
  4. userServiceImpl

    public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) {
    Connection connection = null;
    List<User> userList = null;
    try {
    connection = BaseDao.getConnection();
    userList = userDao.getUserList(connection, queryUserName, queryUserRole,currentPageNo,pageSize);
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    BaseDao.closeResource(connection,null,null);
    } return userList;
    }

3、获取角色操作

为了我们职责统一,可以把角色的操作单独放在一个包中,和POJO类对应

RoleDao

public interface RoleDao {
//获取角色列表
public List<Role> getRoleList(Connection connection) throws SQLException;
}

RoleDaoImpl

public List<Role> getRoleList(Connection connection) throws SQLException {

    PreparedStatement pstm = null;
ResultSet resultSet = null;
ArrayList<Role> roleList = new ArrayList<Role>(); if (connection!=null){
String sql = "select * from smbms_role";
Object[] params = {};
resultSet = BaseDao.execute(connection, pstm, resultSet, sql, params); while (resultSet.next()){
Role _role = new Role();
_role.setId(resultSet.getInt("id"));
_role.setRoleCode(resultSet.getString("roleCode"));
_role.setRoleName(resultSet.getString("roleName"));
roleList.add(_role);
}
BaseDao.closeResource(null,pstm,resultSet);
}
return roleList;
}

RoleService

//获取角色列表
public List<Role> getRoleList();

RoleServiceImpl

public class RoleServiceImpl implements RoleService{

    //引入Dao
private RoleDao roleDao = null;
public RoleServiceImpl(){
roleDao = new RoleDaoImpl();
} public List<Role> getRoleList() {
Connection connection = null;
List<Role> roleList = null;
try {
connection = BaseDao.getConnection();
roleList = roleDao.getRoleList(connection);
} catch (SQLException e) {
e.printStackTrace();
} finally {
BaseDao.closeResource(connection,null,null);
}
return roleList;
}
}

4、用户显示的Servlet

  1. 获取用户前端的数据(查询)
  2. 判断请求是否需要执行,看参数的值判断
  3. 为了实现分页,需要计算出当前页面和总页面,页面大小...
  4. 用户列表展示
  5. 返回前端
//重点,难点
public void query(HttpServletRequest req, HttpServletResponse resp){
//查询用户列表
//从前端获取数据:
String queryUserName = req.getParameter("queryname");
String temp = req.getParameter("queryUserRole");
String pageIndex = req.getParameter("pageIndex");
int queryUserRole = 0; //获取用户列表
UserServiceImpl userService = new UserServiceImpl();
List<User> userList = null; //第一次走这个请求,一定是第一页,页面大小固定的;
int pageSize = 5;//可以把这个写到配置文件中,方便后期修改;
int currentPageNo = 1; if (queryUserName == null){
queryUserName = ""; //不手动赋值会产生空指针异常
}
if (temp != null && !temp.equals("")){
queryUserRole = Integer.parseInt(temp); //给查询赋值!0,1,2,3
}
if (pageIndex != null){
currentPageNo = Integer.parseInt(pageIndex);
} //获取用户的总数(分页:上一页,下一页的情况)
int totalCount = userService.getUserCount(queryUserName,queryUserRole);
//总页数支持
PageSupport pageSupport = new PageSupport();
pageSupport.setCurrentPageNo(currentPageNo);
pageSupport.setPageSize(pageSize);
pageSupport.setTotalCount(totalCount); int totalPageCount = pageSupport.getTotalPageCount(); //总共有几页 //控制首页和尾页
//如果页面要小于1了,就显示第一页的东西
if (totalPageCount<1){
currentPageNo = 1;
}else if (currentPageNo>totalPageCount){ //当前页面大于了最后一项;
currentPageNo = totalPageCount;
} //获取用户列表展示
userList = userService.getUserList(queryUserName, queryUserRole, currentPageNo, pageSize);
req.setAttribute("userList",userList); RoleServiceImpl roleService = new RoleServiceImpl();
List<Role> roleList = roleService.getRoleList();
req.setAttribute("roleList",roleList);
req.setAttribute("totalCount",totalCount);
req.setAttribute("currentPageNo",currentPageNo);
req.setAttribute("totalPageCount",totalPageCount);
req.setAttribute("queryUserName",queryUserName);
req.setAttribute("queryUserRole",queryUserRole); //返回前端
try {
req.getRequestDispatcher("userlist.jsp").forward(req,resp);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

小黄鸭调试法

6、SMBMS架构分析

smbms项目核心功能实现的更多相关文章

  1. discuz论坛apache日志hadoop大数据分析项目:清洗数据核心功能解说及代码实现

    discuz论坛apache日志hadoop大数据分析项目:清洗数据核心功能解说及代码实现http://www.aboutyun.com/thread-8637-1-1.html(出处: about云 ...

  2. Chrome扩展开发之四——核心功能的实现思路

    目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...

  3. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  4. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  5. Python交互K线工具 K线核心功能+指标切换

    Python交互K线工具 K线核心功能+指标切换 aiqtt团队量化研究,用vn.py回测和研究策略.基于vnpy开源代码,刚开始接触pyqt,开发界面还是很痛苦,找了很多案例参考,但并不能完全满足我 ...

  6. Spring框架的IOC核心功能快速入门

    2. 步骤一:下载Spring框架的开发包 * 官网:http://spring.io/ * 下载地址:http://repo.springsource.org/libs-release-local/ ...

  7. Bing词典vs有道词典比对测试报告——功能篇之核心功能

    必应词典vs有道词典 核心功能对比 从应用的UI布局来看,这两款软件的功能如下: 相同 不同 必应词典 词典.例句.翻译 百科 有道词典 词典.例句.翻译 应用 就词典类软件来说,词典是最核心的功能. ...

  8. Linux学习-核心编译的前处理与核心功能选择

    硬件环境检视与核心功能要求 根据自己的需求来确定编译的选项 保持干净原始码: make mrproper 我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下 ...

  9. 自己实现spring核心功能 一

    聊聊spring spring对于java开发者来说,是最熟悉不过的框架了,我们日常开发中每天都在使用它.它有着各种各样的好处,简单易用,得心应手... ... 我们一说到spring就会讲到ioc ...

随机推荐

  1. INFO client.RMProxy: Connecting to ResourceManager at hadoop

    1.查看防火墙是否没关闭. 2.用jps 命令查看是否没有启动resourcemanager

  2. 利用词向量进行推理(Reasoning with word vectors)

    The amazing power of word vectors | the morning paper (acolyer.org) What is a word vector? At one le ...

  3. AOP-操作术语

    AOP(术语) 1,连接点 类里面哪些方法可以被增强,这些方法称为连接点 2,切入点 实际被真正增强的方法,称为切入点 3,通知(增强) (1)实际增强的逻辑部分称为通知(增强) (2)通知有多种类型 ...

  4. linux 创建用户 用户组,sudo,禁止root远程ssh登录

    创建用户  useradd hanli 为新用户设置密码(在root下可以为普通用户重置密码)  passwd hanli 创建用户组  groupadd  op 将用户添加到用户组  usermod ...

  5. 使用Hot Chocolate和.NET 6构建GraphQL应用(4) —— 实现Query映射功能

    系列导航 使用Hot Chocolate和.NET 6构建GraphQL应用文章索引 需求 在上一篇文章使用Hot Chocolate和.NET 6构建GraphQL应用(3) -- 实现Query基 ...

  6. ApacheCN 深度学习译文集 2020.9

    协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 不要担心自己的形象,只关心如何实现目标.--<原则>,生活原则 2.3.c 在线阅读 ApacheCN 面试求职交流群 72418 ...

  7. 通俗讲解IP地址的端口

    ========================================================================================= 在我看来,学习jav ...

  8. NOIP2018 Day2T3 保卫王国

    首先不考虑强制要求的话是一个经典问题,令 \(f_{i, 0 / 1}\) 为 \(i\) 选或不选时以 \(i\) 为根的子树的最优答案.那么就有转移 \(f_{u, 0} = \sum f_{v, ...

  9. Android图表库hellocharts详解

    感谢大佬:https://www.cnblogs.com/huolongluo/p/5988644.html 因为项目需要搞一个折线图,按照日期显示相应的成绩,所以有了本文. 以前用过一次XCL-ch ...

  10. SlidingMenu addIgnoreView() 无效的bug解决方法

    ## 感谢大佬:https://blog.csdn.net/fuchaosz/article/details/51513288 1 简介 最近在做侧滑的时候用到了SlidingMenu,在MainAc ...