精华内容
下载资源
问答
  • 模块主要实现android客户端输入用户名与密码后,通过Post请求获得服务器端servlet响应,从而实现下一步操作,本篇先介绍服务器端编程与数据库一些表设置。 通信流程为 : Andriod客户端 ---> Web服务器...

    原地址:http://www.cnblogs.com/moka/archive/2013/05/13/3075417.html

    该模块主要实现android客户端输入用户名与密码后,通过Post请求获得服务器端servlet的响应,从而实现下一步的操作,本篇先介绍服务器端的编程与数据库的一些表设置。

    通信流程为 : Andriod客户端 ---> Web服务器端(Tomcat) ---> 数据库服务器 (MySql) ---> Web服务器端(Tomcat) ---> Andriod客户端

    web服务器端与数据库的通信采用JDBC,为了逻辑更清晰,采用了MVC + DAO(DataAccessObjects)数据访问对象,用户数据放在Wireless_db的usertbl表中。

    如下图所示:

     

     

    新建一个动态网页项目,结构如下图

     

     

    首先写一个数据库工具类用来连接或断开与数据库的Connection,在此之前,为了程序的拓展性,我们把一些jdbc需要的基本配置信息放入DBConfig.properties配置文件中,方便移植数据库

    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/wireless_db
    username=root
    password=root

    然后写DBUtil类:

    复制代码
    /**
     *    数据库工具类
     */
    public class DBUtil {
        
    
        /*
         * 打开数据库连接
         */
        public Connection openConnection() {
            Properties prop = new Properties();
            String driver = null;
            String url = null;
            String username = null;
            String password = null;
    
            try {
                // 将properties文件载入Properties类实例
                prop.load(this.getClass().getClassLoader().getResourceAsStream(
                        "DBConfig.properties"));
    
                driver = prop.getProperty("driver");
                url = prop.getProperty("url");
                username = prop.getProperty("username");
                password = prop.getProperty("password");
                
                // 下句便相当于普通情况下使用jdbc的Class.forName("com.mysql.jdbc.Driver");
                Class.forName(driver);
                return DriverManager.getConnection(url, username, password);
                
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return null;
        }
        
        /*
         * 关闭数据库连接
         */
        public void closeConn(Connection conn){
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        
    }
    复制代码

    至此,对数据库连接相关操作的封装完毕

     

    接下来要将数据库的用户表封装成User类,方便服务器端操作:

    复制代码
    /**
     *    用于封装UserTbl表的实体类
     */
    public class User {
        // 编号
        private int id;
        // 账号
        private String account;
        // 密码
        private String password;
        // 用户名称
        private String name;
        // 性别
        private String gender;
        // 权限
        private int permission;
        // 备注
        private String remark;
        
        // 下面全是7个字段的getter与setter
        public String getAccount() {
            return account;
        }
        public void setAccount(String account) {
            this.account = account;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public int getPermission() {
            return permission;
        }
        public void setPermission(int permission) {
            this.permission = permission;
        }
        public String getRemark() {
            return remark;
        }
        public void setRemark(String remark) {
            this.remark = remark;
        }
        
    }
    复制代码

    至此,对数据库用户表信息的封装完毕

     

    然后编写Dao接口并为它写一个实现类:

    复制代码
    package com.moka.dao;
    
    import com.moka.entity.User;
    
    // UesrDao接口
    public interface UserDao {
        // 登录方法
        public User login(String account,String password);
    }
    复制代码
    复制代码
    /**
     * 用户登录DAO实现类
     */
    public class UserDaoImpl implements UserDao {
        
        /**
         * 通过用户名称和密码登录,登录成功返回User对象,登录失败返回null
         */
        public User login(String account, String password) {
            
            // 查询SQL语句,
            String sql = " select id, account, password, name, gender, permission, remark " +
                            "from usertbl " +
                            "where account=? and password=? ";
            
            // 实例化数据库连接工具类,获得连接,准备PreparedStatement和结果集
            DBUtil util = new DBUtil();
            Connection conn = util.openConnection();
            PreparedStatement ps = null;
            ResultSet rs = null;
            
            try {
                // 获得PreparedStatement
                ps = conn.prepareStatement(sql);
                // 设置查询参数
                ps.setString(1, account);
                ps.setString(2, password);
                // 执行查询
                rs = ps.executeQuery();
                // 判断用户是否存在
                if (rs.next()) {
                    // 获得用户信息(重要细节:此处获取的位置数字要依照上面的sql语句中的顺序,而不一定是数据库中的顺序)
                    int id = rs.getInt(1);
                    String name = rs.getString(4);
                    int permission = rs.getInt(6);
                    String remark = rs.getString(7);
                    
                    // 封装用户信息
                    User user = new User();
                    user.setId(id);
                    user.setAccount(account);
                    user.setPassword(password);
                    user.setName(name);
                    user.setPermission(permission);
                    user.setRemark(remark);
                    return user;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (rs != null) {
                        rs.close();
                        rs = null;
                    }
                    if (ps != null) {
                        ps.close();
                        ps = null;
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                util.closeConn(conn);
            }
            return null;
        }
        
    }
    复制代码

    至此,数据访问操作成功封装在DAO类中

     

    然写Tomcat服务器上运行的servlet,主要复写doGet()方法:

    复制代码
    /**
     * 响应 Android客户端发来的请求
     */
    public class LoginServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html");
            // 获得响应的输出流
            PrintWriter pw = response.getWriter();
            // 获得客户端请求参数
            String account = request.getParameter("account");
            String password = request.getParameter("password");
    
            //实例化数据访问对象
            UserDao dao = new UserDaoImpl();
            User user = dao.login(account, password);
            if (user != null) {
                // 响应客户端内容,登录成功
                pw.print(build(user));
            } else {
                // 响应客户端内容,登录失败
                pw.print("0");
            }
            pw.flush();
            pw.close();
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doGet(request, response);
        }
        
        
        // 此方法生成一个当前用户信息字符串返回给客户端
        private String build(User u) {
            String userMsg = "";
            userMsg += "id=" + u.getId();
            userMsg += ";";
            userMsg += "name=" + u.getName();
            return userMsg;
        }
    }
    复制代码

     

    最后是一些配置工作:

    jdbc驱动放在WebContent下WEB_INF的lib文件夹下即可

    然后要把此servlet配置在web.xml文件中:

    复制代码
    <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>com.moka.servlet.LoginServlet</servlet-class>
    </servlet>
         
    <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/servlet/LoginServlet</url-pattern>
    </servlet-mapping>
    复制代码

    至此,服务器端搭建完毕

    展开全文
  • "登录系统" ); setContentView(R.layout.activity_login); cancelBtn = (Button) findViewById(R.id.cancelButton); loginBtn = (Button) findViewById(R.id.loginButton); userEditText = (EditText) ...

    原博客地址:http://www.cnblogs.com/moka/archive/2013/05/13/3075500.html

    写完服务器端之后,开始完成客户端,客户端斜对比较简单,新建一个Android项目结构如下:

    com.moka.activities放各种主UI操作界面,com.moka.util包中放工具类

    布局文件这里省略了,非常简单,看起来像这样:

     

    先写工具类HttpUtil,此类封装了get与post方式发出请求与接受回应的各种方法

    复制代码
    public class HttpUtil {
        // 基础URL,注意此处若为模拟器实验,ip不可为localhost而需要为需要为10.0.2.2
        public static final String BASE_URL="http://10.0.2.2:8080/WirelessServer/";
        // 获得Get请求对象request
        public static HttpGet getHttpGet(String url){
            HttpGet request = new HttpGet(url);
             return request;
        }
        // 获得Post请求对象request
        public static HttpPost getHttpPost(String url){
             HttpPost request = new HttpPost(url);
             return request;
        }
        // 根据请求获得响应对象response
        public static HttpResponse getHttpResponse(HttpGet request) throws ClientProtocolException, IOException{
            HttpResponse response = new DefaultHttpClient().execute(request);
            return response;
        }
        // 根据请求获得响应对象response
        public static HttpResponse getHttpResponse(HttpPost request) throws ClientProtocolException, IOException{
            HttpResponse response = new DefaultHttpClient().execute(request);
            return response;
        }
        
        // 发送Post请求,获得响应查询结果
        public static String queryStringForPost(String url, String account, String password){
            // 根据url获得HttpPost对象
            HttpPost request = HttpUtil.getHttpPost(url);
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("account", account));
            params.add(new BasicNameValuePair("password", password));
            String result = null;
            try {
                request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
                // 获得响应对象
                HttpResponse response = HttpUtil.getHttpResponse(request);
                // 判断是否请求成功
                if(response.getStatusLine().getStatusCode()==200){
                    // 获得响应
                    result = EntityUtils.toString(response.getEntity());
    System.out.println("HttpUtil result: " + result);
                    return result;
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                result = "网络异常!";
                return result;
            } catch (IOException e) {
                e.printStackTrace();
                result = "网络异常!";
                return result;
            }
            return null;
        }
    
        // 发送Get请求,获得响应查询结果
        public static String queryStringForGet(String url){
            // 获得HttpGet对象
            HttpGet request = HttpUtil.getHttpGet(url);
            String result = null;
            try {
                // 获得响应对象
                HttpResponse response = HttpUtil.getHttpResponse(request);
                // 判断是否请求成功
                if(response.getStatusLine().getStatusCode()==200){
                    // 获得响应
                    result = EntityUtils.toString(response.getEntity());
                    return result;
                }
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                result = "网络异常!";
                return result;
            } catch (IOException e) {
                e.printStackTrace();
                result = "网络异常!";
                return result;
            }
            return null;
        }
    }
    复制代码

     

    然后写Activity:

    准备组件和监听事件:

    复制代码
    public class LoginActivity extends Activity {
    
        private Button cancelBtn, loginBtn;
        private EditText userEditText, pwdEditText;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setTitle("登录系统");
            setContentView(R.layout.activity_login);
            
            cancelBtn = (Button) findViewById(R.id.cancelButton);
            loginBtn = (Button) findViewById(R.id.loginButton);
            userEditText = (EditText) findViewById(R.id.userEditText);
            pwdEditText = (EditText) findViewById(R.id.pwdEditText);
    
            cancelBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    finish();
                }
            });
    
            loginBtn.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 检查用户是否输入用户名密码
                    if (validate()) {
                        // 检查是否登陆成功
                        if (login()) {
                            Toast.makeText(LoginActivity.this, "成功",
                                    Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(LoginActivity.this, "用户名称或者密码错误,请重新输入!",
                                    Toast.LENGTH_SHORT).show();
                        }
                    }
                }
            });
        }
    复制代码

     

    验证用户是否输入用户名和密码的方法:

    复制代码
        // 验证用户名密码是否为空
        private boolean validate() {
            String username = userEditText.getText().toString();
            if (username.equals("")) {
                Toast.makeText(LoginActivity.this, "用户名称是必填项!", Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
            String pwd = pwdEditText.getText().toString();
            if (pwd.equals("")) {
                Toast.makeText(LoginActivity.this, "用户密码是必填项!", Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
            return true;
        }
    复制代码

     

    验证登陆方法:

    复制代码
        // 登录方法
        private boolean login() {
            // 获得用户名称
            String username = userEditText.getText().toString().trim();
            // 获得密码
            String pwd = pwdEditText.getText().toString().trim();
            // 获得登录结果
            String result = query(username, pwd);
            if (result != null && result.equals("0")) {
                return false;
            } else {
    System.out.println("LoginActivity result: " + result);
                // 将此服务器返回的此用户信息保存起来
                saveUserMsg(result);
                return true;
            }
        }
    复制代码
    View Code

     

    保存用户信息的方法:

    复制代码
        // 将用户信息保存到配置文件
        private void saveUserMsg(String msg) {
            // 用户编号
            String id = "";
            // 用户名称
            String name = "";
            // 获得信息数组
            String[] msgs = msg.split(";");
            int idx = msgs[0].indexOf("=");
            id = msgs[0].substring(idx + 1);
            idx = msgs[1].indexOf("=");
            name = msgs[1].substring(idx + 1);
            // 共享信息
            SharedPreferences pre = getSharedPreferences("user_msg",
                    MODE_WORLD_WRITEABLE);
            SharedPreferences.Editor editor = pre.edit();
            editor.putString("id", id);
            editor.putString("name", name);
            editor.commit();
        }
    复制代码

    记得在Manifest.xml中添加网络权限。

    运行效果图:

    成功后用户信息文件生成位置(data/data文件夹下)与内容:

     

    至此,android与服务器登录通信模块成功实现

    展开全文
  • 一个电商系统的商品模块功能的实现 简介: 完成一个电商系统的商品模块功能,商品类包含以下属性:商品ID,商品名,类别名,单价,库存量,产地,计量单位等信息,要求实现商品管理功能以及管理员登录功能,具体如下:...

    一个电商系统的商品模块功能的实现

    简介:

    完成一个电商系统的商品模块功能,商品类包含以下属性:商品ID,商品名,类别名,单价,库存量,产地,计量单位等信息,要求实现商品管理功能以及管理员登录功能,具体如下:

    1. 管理员登录(账号密码固定admin/admin)

    2. 修改管理员密码

    3. 商品添加

    4. 商品列表

    5. 查询指定id的商品

    6. 根据商品id删除商品

    7. 根据id修改指定商品的价格

    8. 根据id修改指定商品的库存

    9. 根据商品类别查询所有商品

    10. 查询指定价格区间的商品信息

    本代码分为四个部分:

    管理员类(Manager):

    
    public class Mannager {
    
    	private String account = "admin";
    	String password = "admin";
    
    	public boolean init(String account, String password) {
    		if (this.account.equals(account) && this.password.equals(password)) {
    			System.out.println("登录成功!!");
    		}
    		return false;
    	}
    
    	public void update(String password) {
    		this.password = password;
    		System.out.println("修改成功!!!");
    
    	}
    
    }
    

    商品类(goods):

    package com.softeem.exp1;

    public class Goods {

    private int id;
    private String gname;
    private String lname;
    private double price;
    private int num;
    private String field;// 产地
    private String unit;// 计量单位
    
    public Goods() {
    
    }
    
    public Goods(int id, String gname, String lname, double price, int num, String field, String unit) {
    	super();
    	this.id = id;
    	this.gname = gname;
    	this.lname = lname;
    	this.price = price;
    	this.num = num;
    	this.field = field;
    	this.unit = unit;
    }
    
    public int getId() {
    	return id;
    }
    
    public void setId(int id) {
    	this.id = id;
    }
    
    public String getGname() {
    	return gname;
    }
    
    public void setGname(String gname) {
    	this.gname = gname;
    }
    
    public String getLname() {
    	return lname;
    }
    
    public void setLname(String lname) {
    	this.lname = lname;
    }
    
    public double getPrice() {
    	return price;
    }
    
    public void setPrice(double price) {
    	this.price = price;
    }
    
    public int getNum() {
    	return num;
    }
    
    public void setNum(int num) {
    	this.num = num;
    }
    
    public String getField() {
    	return field;
    }
    
    public void setField(String field) {
    	this.field = field;
    }
    
    public String getUnit() {
    	return unit;
    }
    
    public void setUnit(String unit) {
    	this.unit = unit;
    }
    
    @Override
    public String toString() {
    	return "Goods [id=" + id + ", gname=" + gname + ", lname=" + lname + ", price=" + price + ", num=" + num
    			+ ", field=" + field + ", unit=" + unit + "]";
    }
    

    }

    商品管理类(GoodsManage):

    
    import java.util.ArrayList;
    
    public class GoodsMannage {
    
    	static ArrayList<Goods> list = new ArrayList<>();
    
    	public void add(Goods good) {
    		list.add(good);
    	}
    
    	public void list() {
    		for (Goods g : list) {
    			System.out.println(g);
    		}
    	}
    
    	public void findById(int id) {
    		for (Goods g : list) {
    			if (g != null && g.getId() == id) {
    				System.out.println(g);
    			}
    		}
    	}
    
    	public boolean delet(int id) {
    		for (Goods g : list) {
    			if (g != null && g.getId() == id) {
    				return list.remove(g);
    			}
    		}
    		return false;
    
    	}
    
    	public boolean updateByid1(int id, double price) {
    		for (Goods g : list) {
    			if (g != null && g.getId() == id) {
    				g.setPrice(price);
    				return true;
    			}
    		}
    		return false;
    	}
    
    	public boolean updateByid2(int id, int num) {
    		for (Goods g : list) {
    			if (g != null && g.getId() == id) {
    				g.setNum(num);
    				return true;
    			}
    		}
    		return false;
    	}
    
    	public ArrayList<Goods> findByField(String field) {
    		ArrayList<Goods> gds = new ArrayList<>();
    		for (Goods g : list) {
    			if (g != null && g.getField().equals(field)) {
    				gds.add(g);
    				return gds;
    			}
    		}
    		return gds;
    	}
    
    	public void findByPrice(double price1, double price2) {
    		for (Goods g : list) {
    			if (g != null && price1 <= g.getPrice() && g.getPrice() <= price2) {
    				System.out.println(g);
    			}
    		}
    	}
    
    }
    

    测试类(Test):

    
    import java.util.Scanner;
    
    public class Test {
    	private GoodsMannage gm = new GoodsMannage();
    	private Mannager m = new Mannager();
    	private Scanner sc;
    
    	public void menu() {
    		msg("=========================");
    		msg("=========电商系统==========");
    		msg("======【1】管理员登录=======");
    		msg("======【2】修改管理员密码====");
    		msg("======【3】商品添加=====");
    		msg("======【4】商品列表=====");
    		msg("======【5】查询指定id的商品===");
    		msg("======【6】根据商品id删除商品=====");
    		msg("======【7】根据id修改指定商品的价格=====");
    		msg("======【8】根据id修改指定商品的库存=====");
    		msg("======【9】根据商品类别查询所有商品======");
    		msg("======【10】查询指定价格区间的商品信息=====");
    		msg("======【0】退出系统=========");
    		msg("=========================");
    		msg("请输入操作指令:");
    		start();
    	}
    
    	private void start() {
    		sc = new Scanner(System.in);
    		int i = sc.nextInt();
    		switch (i) {
    		case 1:
    			init();
    			break;
    		case 2:
    			updept();
    			break;
    		case 3:
    			add();
    			break;
    		case 4:
    			list();
    			break;
    		case 5:
    			queryByid();
    			break;
    		case 6:
    			deletByid();
    			break;
    		case 7:
    			updatePriceById();
    			break;
    		case 8:
    			updateNumById();
    			break;
    		case 9:
    			queryByField();
    			break;
    		case 10:
    			queryByPrice();
    			break;
    		case 0:
    			exit();
    			break;
    		default:
    			msg("请输入正确的操作指令!!!");
    			break;
    		}
    		menu();
    	}
    
    	private void exit() {
    		sc = new Scanner(System.in);
    		msg("是否确定退出?(Y/N)");
    		String op = sc.next();
    		if (op.equalsIgnoreCase("y")) {
    			msg("谢谢使用,再见!");
    			System.exit(1);
    		}
    
    	}
    
    	private void queryByPrice() {
    		gm.findByPrice(20, 50);
    
    	}
    
    	private void queryByField() {
    		gm.findByField("饮料");
    
    	}
    
    	private void updateNumById() {
    		gm.updateByid2(3, 400);
    
    	}
    
    	private void updatePriceById() {
    		gm.updateByid1(1, 60);
    
    	}
    
    	private void deletByid() {
    		gm.delet(2);
    
    	}
    
    	private void queryByid() {
    		gm.findById(1);
    
    	}
    
    	private void list() {
    		gm.list();
    
    	}
    
    	private void add() {
    		Goods g1 = new Goods(1, "牛奶", "饮料", 50, 100, "蒙古", "箱");
    		Goods g2 = new Goods(2, "牙刷", "生活用品", 10, 200, "广东", "根");
    		Goods g3 = new Goods(3, "可乐", "饮料", 40, 400, "广东", "箱");
    		Goods g4 = new Goods(4, "纸巾", "生活用品", 30, 300, "上海", "提");
    		gm.add(g1);
    		gm.add(g2);
    		gm.add(g3);
    		gm.add(g4);
    
    	}
    
    	private void updept() {
    		m.update("123456");
    
    	}
    
    	private void init() {
    		if (m.init("admin", "admin"))
    			;
    		menu();
    
    	}
    
    	private void msg(Object object) {
    		System.out.println(object);
    
    	}
    
    	public static void main(String[] args) {
    		new Test().menu();
    	}
    }
    
    

    运行截图

    在这里插入图片描述

    展开全文
  • Python实现基于模块的库存管理系统

    千次阅读 2020-02-13 14:16:39
    本案例是通过一个多模块的库存管理系统案例,帮助读者深入了解基于模块的Python应用程序的开发流程。
    
    

    一:系统测试运行

    ------ 库存信息管理系统-------
    | 1: 增加产品信息
    | 2: 产品信息报表
    | 3: 增加货架位置
    | 4: 货架位置报表
    | 5: 商品入库管理
    | 6: 商品出库管理
    | 7: 商品库存信息报表
    | 0: 退出
    ------------------------------
    请选择功能菜单(0-7):
    

    二:库存管理系统概述

    sku:Stock Keeping Unit,最小存货单位

    • 本节实现一个简单的基于模块的库存管理系统。
    • 系统采用JSON文件来保存数据。
    • 产品信息设计为字典,键为sku_id (产品ID),值为sku_name (产品名称),使用products.json实现其持续化。
    • 货架位置信息也设计为字典,键为loc_id (货架ID),值为loc_name (货架名称),使用location.json实现其持续化。
    • 商品库存信息设计为列表[sku_id, loc_id] 的列表,使用items.json实现其持续化。

    库存管理系统设计为三个模块文件: data.py、ui.py 和 main.py

    库存管理系统data.py负责数据的管理
    库存管理系统ui.py负责用户界面交互

    三:数据处理模块data.py的实现

    • 库存管理系统data.py负责数据的管理
    • 通过Python标准库模块json中的loads()函数和dumps()函数,可以实现从JSON文件读取数据和转储数据到JSON文件的功能。

    库存管理系统数据处理模块data.py。

    import os
    import json
    
    #全局变量
    _products = {} #保存产品信息的字典: sku_id:sku_name
    _locations = {} #保存货架位置的字典: loc_id:loc_name
    _items = [] #保存商品库存的列表,元素为元组(sku_id,loc_id)
    
    def init():
      """从磁盘JSON格式文件中读取数据"""
      global _products, _locations, _items
      if os.path.exists("products.json"):
        f = open("products.json", "r", encoding = 'utf-8')
        _products = json.loads(f.read())
        f.close()
      if os.path.exists("locations.json"):
        f = open("locations.json", "r", encoding = 'utf-8')
        _locations = json.loads(f.read())
        f.close()
      if os.path.exists("items.json"):
        f = open("items.json", "r", encoding ='utf-8')
        _items = json.loads(f.read())
        f.close()
    
    def _save_products():
      """把产品信息数据_products以JSON格式保存到磁盘文件"""
      global _products
      f = open("products.json", "w", encoding ='utf-8')
      f.write(json.dumps(_products, ensure_ascii = False))
      f.close()
      
    def _save_locations():
      """把货架位置数据_ locations以JSON格式保存到磁盘文"""
      global _locations
      f = open("locations.json", "w", encoding ='utf-8')
      f.write(json.dumps(_locations))
      f.close()
    
    def _save_items():
      """把商品库存数据_ items以JSON格 式保存到磁盘文件"""
      global _items
      f = open("items.json", "w", encoding ='utf-8')
      f.write(json.dumps(_items))
      f.close()
    
    def get_products(): 
      """返回产品信息"""
      global _products
      return _products
    
    def get_locations():
      """返回货架位置信息"""
      global _locations
      return _locations
    
    def get_items():
      """返回商品库存信息"""
      global _items
      return _items
    
    def add_product(sku_id, sku_name):
      """增加一个产品sku_ id、sku_name"""
      global _products
      _products[sku_id] = sku_name
      _save_products()
    
    def add_location(loc_id, loc_name):
      """增加一个货架位置loc_ id、 loc_ name"""
      global _locations
      _locations[loc_id] = loc_name
      _save_locations()
    
    def add_item(sku_id, loc_id):
      """入库一件商品:商品sku_ id、 货架sku_ id"""
      global _items
      _items.append((sku_id, loc_id))
      _save_items()
    
    def remove_item(sku_id, loc_id):
      """出库一件商品:商品sku_ id、货架sku_ id, 返回True; 如果不存在, 返回False"""
      global _items
      for i in range(len(_items)):
        if sku_id == _items[i][0] and loc_id == _items[i][1]:
          del _items[i]
          _save_items()
          return True
      return False
    

    四:用户界面交互模块ui.py的实现

    • 库存管理系统ui.py负责用户界面交互
    • 用户界面交互模块导入data模块
    • 字典.items() 返回字典的(key, value)对的列表

    库存管理系统用户界面交互模块ui.py

    import data
    
    def prompt_for_action():
      """提示功能菜单。返回用户输入选择"""
      while True:
        print('------ 库存信息管理系统-------')
        print('| 1: 增加产品信息')
        print('| 2: 产品信息报表')
        print('| 3: 增加货架位置')
        print('| 4: 货架位置报表')
        print('| 5: 商品入库管理')
        print('| 6: 商品出库管理')
        print('| 7: 商品库存信息报表')
        print('| 0: 退出')
        print('------------------------------')
        
        choice = input('请选择功能菜单(0-7):')
        if choice == '0': return 'QUIT'
        elif choice == '1': return 'ADD_PRODUCT'
        elif choice == '2': return 'REPORT_PRODUCTS'
        elif choice == '3': return 'ADD_LOCATION'
        elif choice == '4': return 'REPORT_LOCATIONS'
        elif choice == '5': return 'ADD_ITEM'
        elif choice == '6': return 'REMOVE_ITEM'
        elif choice == '7': return 'REPORT_ITEMS'
    
    def prompt_for_old_sku_id():
      """提示用户输入有效的产品sku_id并返回有效产品ID, 或者返回None"""
      while True:
        sku_id = input("请输入产品ID:")
        if sku_id == "":
          return None
        elif sku_id not in data.get_products():
          print("该产品不存在,请重新输入")
        else:
          return sku_id
    
    def prompt_for_new_sku_id():
      """提示用户输入新的产品sku_id并返回新产品ID, 或者返回None"""
      while True:
        sku_id = input("请输入新的产品ID:")
        if sku_id == "": 
          return None
        elif sku_id in data.get_products():
          print("该产品已经存在,请重新输入")
        else:
          return sku_id
    
    def prompt_for_old_loc_id():
      """提示用户输入有效的货架位置loc_id并返回有效货架位置ID,或者返回None"""
      while True:
        loc_id = input("请输入货架位置ID:")
        if loc_id == "":
          return None
        elif loc_id not in data.get_locations():
          print("该货架位置不存在,请重新输入")
        else:
          return loc_id
    
    def prompt_for_new_loc_id():
      """提示用户输入新的货架位置loc_ id并返回,或者返回None"""
      while True:
        loc_id = input ("请输新的货架位置ID:")
        if loc_id == "": 
          return None
        elif loc_id in data.get_locations():
          print('该货架位置已经存在,请重新输入')
        else:
          return loc_id
    
    def prompt_for_sku_name():
      """提示用户输入产品名称sku_name并返回产品名称,或者返回None"""
      while True:
        sku_name = input("请输入产品名称:")
        if sku_name =="": 
          return None
        else: 
          return sku_name
    
    def prompt_for_loc_name():
      """提示用户输入货架位置名称loc_ name并返回货架位置名称,或者返回None"""
      while True:
        loc_name = input("请输入货架位置名称:")
        if loc_name == "": return None
        else: return loc_name
    
    def report_products():
      """产品信息报表"""
      for (k, v) in data.get_products().items():
        print('{0:8} {1}'.format(k, v))
    
    def report_locations():
      """货架位置报表"""
      for (k, v) in data.get_locations().items():
        print(' {0:8} {1}'. format(k, v))
    
    def report_items():
      """库存信息报表"""
      for (k, v) in data.get_items():
        sku_name = data.get_products()[k]
        loc_name = data.get_locations()[v]
        print('{0:8} {1}: {2:8} {3}'.format(k, sku_name, v, loc_name))
    

    五:库存管理系统的功能设计

    终究逃不过增、删、改、查四个字

    prompt,提示

    1. 增加产品信息
      调用ui.prompt_for_new__sku_id(),提示用户输入新的产品ID,
      调用ui.prompt_for_sku_name(),提示用户输入产品名称。
      调用data.add_product(sku_id, sku_name) 增加新的产品。
      如果用户输入为空,则返回None,即什么也不做。

    2. 产品信息报表
      调用ui.report_products(),显示产品信息列表。

    3. 增加货架位置
      调用ui.prompt_for_new_loc_id(), 提示用户输入新的货架位置ID,
      调用ui.prompt_for_loc_name(),提示用户输入货架名称。
      调用data.add_location(sku_id, sku_name) 增加新的货架。
      如果用户输入为空,则返回None,即什么也不做。

    4. 货架位置报表
      调用ui.report_location(),显示货架位置信息列表。

    5. 商品入库管理
      调用ui.prompt_for_old_sku_id(),提示用户输入产品ID,
      调用ui.prompt_for_old_loc_id(),提示用户输入货架ID。
      调用data.add_item(sku_id, loc_id),实现商品入库。
      如果用户输入为空,则返回None,即什么也不做。

    6. 商品出库管理
      调用ui.prompt_for_old_sku_id(),提示用户输入产品ID,
      调用ui.prompt_for_old_loc_id(),提示用户输入货架ID。
      调用data.remove_item(sku_id, loc_id),实现商品出库。
      如果库存不存在,则报错。如果用户输入为空,则返回None,即什么也不做。

    7. 商品库存信息报表
      调用ui.report_items(), 显示库存信息列表。

    六:主模块main.py的实现

    • 主模块导入data和ui模块。
    • 在main.py中,定义main()函数,首先调用data.init(),从磁盘JSON格式文件中读取数据。然后在无限循环中,调用ui.prompt_for_action()显示功能菜单,接受用户输入,并根据用户的功能选择,实现各模块相应功能。

    库存管理系统主模块main. py

    """库存管理系统:基于JS0N"""
    import data
    import ui
    
    def main():
      data.init()
      while True:
        action = ui.prompt_for_action()
        if action == 'QUIT':
          break
        elif action == 'ADD_PRODUCT':
          sku_id = ui.prompt_for_new_sku_id()
          if sku_id != None: 
            sku_name = ui.prompt_for_sku_name() 
            if sku_name != None: 
              data.add_product(sku_id, sku_name)
        elif action == 'REPORT_PRODUCTS':
          ui.report_products()
        elif action == 'ADD_LOCATION':
          loc_id = ui.prompt_for_new_loc_id()
          if loc_id != None:
            loc_name = ui.prompt_for_loc_name()
            if loc_name != None:
              data.add_location(loc_id, loc_name)
        elif action == 'REPORT_LOCATIONS':
          ui.report_locations()
        elif action == 'ADD_ITEM':
          sku_id = ui.prompt_for_old_sku_id()
          if sku_id != None:
            loc_id = ui.prompt_for_old_loc_id()
            if loc_id != None:
              data.add_item(sku_id, loc_id)
        elif action == 'REMOVE_ITEM':
          sku_id = ui.prompt_for_old_sku_id()
          if sku_id != None:
            loc_id = ui.prompt_for_old_loc_id()
            if loc_id != None:
              if not data.remove_item(sku_id, loc_id):
                print('该库存不存在!')
        elif action == 'REPORT_ITEMS':
          ui.report_items()
    
    if __name__ == "__main__": main()
    
    展开全文
  • 实现4G模块EC20在linux系统拨号上网

    万次阅读 热门讨论 2017-01-09 19:09:48
    1.实验目的:实现4G模块EC20在linux系统下的拨号上网(Linux最小系统)2.实验平台:迅为4412开发板。EC20带有UART和USB接口,向linux内核添加4G模块的驱动和PPP协议的支持,然后编译内核并下载到开发板。3.实验流程:...
  • 操作系统的一大功能就是为运行程序分配资源,早期Dos系统时常死机或程序奔溃,一大原因就在于应用程序不能以有序合理方式访问系统资源。在众多系统资源中,内存是系统内核必须小心处理一块,内存分配算法,也是...
  • 本文提供一个替换open系统调用样例代码,使用Linux内核模块实现
  • 在java web 系统中,有时需要根据业务变化动态增加或者减少相关功能模块,如何实现在增加或者减少功能模块时无需重新启动服务器,达到动态检测到项目功能变化。
  • 登录模块的实现

    千次阅读 2017-12-23 17:05:00
    1、模块介绍  以JSP+Servlet+JavaBean模式进行开发,系统流程图如下:  用户登录之前需要进行注册,在注册成功后通过注册用户名和密码进行登录,登录失败可以根据系统提示重新登录,登录成功后进入主页。   ...
  • 卫星任务规划系统时间窗口模块的设计与实现 宗建建 , 李孟军, 姚锋, 贺仁杰 摘要:设计并实现了卫星任务规划系统的时间窗口模块。通过数据接口设置任务的约束要求,利用STK(Satellite Tool Kit)的时间窗口...
  • IM系统中聊天记录模块的设计与实现

    千次阅读 2014-07-16 17:48:59
    看到很多开发IM系统的朋友都想实现聊天记录存储和查询这一不可或缺的功能,这里我就把自己前段时间为傲瑞通(OrayTalk)开发聊天记录模块的经验分享出来,供需要的朋友参考下。
  • 这些天一直苦于使用现成zigbee模块实现多机通讯苦恼。其中最大原因不是各个模块之间怎样进行通信,而是怎样为各个模块节电。如果让模块DOWN机,最要命问题就是是否双方模块都同时开机保持正常应答。如果...
  • 模块管理常规功能自定义系统的设计与实现(04--导入模块)
  • 看图提示:从上往下是根据堆栈倒置过来画流程“..."表示省略IPC机制代码图中有一些地方省略了Callback机制代码同一父节点表示在此父函数内按顺序执行大部分类名和函数名已代表了其功能和意义,还可
  • 基于SNMP/Web的园区网络管理系统中配置模块的实现方法一、概述1.网络管理模式 随着因特网的发展,网络系统变得越来,越来越复杂,日益多样化,对网络系统的管理提出了更高的要求。为此,Internet的核心机构IAB...
  • 模块管理常规功能自定义系统的设计与实现(03--基本系统)
  • 一、实验目的: 实现4G模块sim7100在Linux系统上的拨号上网。 二、实验平台: ...我的4412开发板运行的是Linux最小系统,我们需要向内核添加4G模块的驱动与PPP协议支持,然后在编译内核下载到开发板。
  • 亚当模块数据采集系统VB6.0的实现

    千次阅读 2007-10-31 10:52:00
    作者:马志刚摘要:介绍了以VB6.0为开发工具,采用iDAQ-8000系列模块,通过计算机串口,实现多个传感器输出信号采集处理。对采集到信号再转化为直观数字来进行数据处理。描述了系统的软、硬件设计方法。 ...
  • 三层架构——系统用户登录模块功能实现

    万次阅读 热门讨论 2013-01-28 20:44:13
    UI层:展现给用户界面,并为用户提供对系统进行操作接口,此处即为用户... 业务逻辑层:针对用户身份验证逻辑处理,所以对于登陆模块功能来说业务逻辑层有一个用户身份验证方法,该方法实现对用户身份验证
  • 嵌入式开发,RTOS系统,4G模块没有对应驱动,该怎样实现数据上传?求问~
  • 模块管理常规功能自定义系统的设计与实现 一、设计思想来源  在我20多年编程生涯中所编制管理型软件里,主要功能都是数据列表展示、录入修改删除、处理、输出、查询、图表这几大块。从最初foxbase,...
  • 系统管理模块_部门管理1_实现基本增删改查功能 先不考虑上级部门 设计实体、表 1、设计实体 Department.java public class Department { private Long id; private String name; private String ...
  • 模块图表分析设计  图表分析作为一个辅助信息展示手段也是必须要有。如何为一个模块自定义图表方案,并且能够保存方案是这节要介绍。使一个模块能够具有图表功能需要以下几个步骤:  1.修改模块属性...
  • 经过几天的摸索终于实现了: 在ros系统下,订阅Twist/cmd_vel 消息,经过USB转串口通信,实现了通过灯带实时反映小车(差速)运行状态的功能。...通信部分主要依赖pyserial模块的功能实现。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,679
精华内容 24,271
关键字:

系统模块的实现