crud注册时正则判断用户名和密码

本文介绍了一个简单的用户注册表单实现方法,通过正则表达式验证用户名为中文字符,密码为不超过6位的数字,并使用Spring MVC框架进行前后端交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<form action="<%=path%>/reg.do" method="post">
用户:<input type="text" name="uname"><span>${err }</span><span>${err1 }</span><br>
密码:<input type="text" name="password"><span>${err2 }</span><br>
<input type="submit" value="注册">
 </form>


@RequestMapping("reg.do")
 public String reg(User user,Model model){
 User u = ms.getUser(user);
  if(u !=null){
  model.addAttribute("err", "用户名已存在");
   return "reg";
   }else if(!user.getUname().matches("^[\\u4e00-\\u9fa5]+$")){
  
   model.addAttribute("err1","用户名只能是中文");
    return "reg";
   
  }else if(!user.getPassword().matches("^[0-9]{1,6}$")){
  model.addAttribute("err2", "密码只能是数字并且不能超过6位");
   return "reg";
   }else{
   int i = ms.addUser(user);
   if(i > 0){
    return "login";
    }else{
    return "reg";
    }
    }
    }
    
   



编写一款运行在Android的API35,以java为编程语言,使用直连MySQL 5.7数据库的方法实现仓库管理的系统,要求如下: 1、登录界面上部有“仓库管理系统”字样,使用手机号码密码登录,有三个单选登录权限选择按键分别是:管理员、操作员、普通用户,在登录界面还需要实现记住密码的功能,只有一个登录按键,登录界面直接使用用户表(user)中的枚举类型角色判断登录的权限,勾选自动登陆才使用自动登录功能。 2、仓库管理系统的子功能包括:物品搜索、入库操作、出库操作、添加物品、删除物品、申请物品借用审批、设置库存预警、查看行为操作记录、消息通知、数据统计、添加账号、删除账号、修改密码个人信息。 3、子功能的说明: 物品搜索:按照物品名称、物品ID、物品类别搜索物品的全部信息。 入库操作:输入的字段包括:物品名称、物品数量、图片、详细说明、物品类别;其中物品类别只能看不能选;物品名称只能在已有名称下选择。 出库操作:输入的字段包括:物品名称、物品数量、图片、详细说明、物品类别;物品类别只能看不能选;物品名称只能在已有名称下选择。 添加物品:输入的字段包括:物品类别、物品名称、图片、详细说明、规格、单位、存放位置;物品ID由数据库自增。 删除物品:先跳转到一个搜索页面,然后根据物品ID或物品名称搜索到物品详细信息后显示全部物品信息 ,此才能删除,删除需要确认。 申请物品借用审批:申请物品借用审批的流程是:首先,由普通用户提出申请;然后到操作员审核,审核通过则发送通过消息给普通用户;如操作员审核不通过则需要管理员核实申请是否合理,合理则通过并发送申请通过消息给普通用户,不合理则不通过并且发送不通过消息返回给普通用户。 设置库存预警:可以设置最低最高库存预警;库存预警信息在消息通知中显示;低于最低库存预警,如有出库操作先提示库存低才能操作。 查看行为操作记录:可以按用户、操作类型查找。 消息通知:接收申请物品借用审批中的消息通知;库存预警信息。 数据统计:按年统计消耗品类出入库报表、按月统计消耗品类出入库报表、按消耗品类统计物品数量、按固定资产类统计物品数量、按使用用户统计消耗品类出入库报表。 添加账号:管理员可以添加新用户。 删除账号:删除需要确认。 修改密码:只能修改个人账户的密码。 修改个人信息:只能修改个人账户的信息。 4、登录成功后跳转到的界面是带有底部导航栏的主界面,底部导航栏包括:首页、信息、我的。 5、底部导航栏中, 首页fragment功能有:物品搜索、入库操作、出库操作、添加物品、删除物品、申请物品借用审批、设置库存预警; 信息fragment功能有:查看行为操作记录、接收消息通知、数据统计; 我的fragment功能有:显示账户对应的权限名称姓名、添加账号、删除账号、修改密码个人信息。 6、根据角色权限隐藏部分子功能,其中 管理员拥有全部权限; 操作员拥有的权限有:物品搜索、入库操作、出库操作、添加物品、删除物品、申请物品借用审批、设置库存预警、消息通知、修改密码个人信息; 普通用户权限包括:物品搜索、消息通知、修改密码个人信息、申请物品借用。 7、用户表(user)字段有:用户ID(user_id)、电话号码(phone)、密码(password)、角色(role)、姓名(name)、性别(sex)、年龄(age)、所在部门(department)、创建间(user_create),其中角色性别是枚举类型,登录界面直接使用角色判断登录的权限,用户ID字段是数据库自动增长类型的,在数据库中生成创建间。 8、物品表(goods)字段有:物品ID(goods_id)、物品名称(goods_name)、规格(size)、类别(type)、单位(unit)、存放位置(place)、图片、说明(explain);其中类别用枚举类型,分别是消耗品类固定资产类。 9、实现查看日志的功能:需要实现在:登录、入库、出库、审批、申请等重要事情记录的功能。 10、申请物品借用审批的流程是:首先,由普通用户提出申请;然后到操作员审核,审核通过则发送通过信息给普通用户;如操作员审核不通过则需要管理员核实申请是否合理,合理则通过,不合理则不通过并且发送不通过信息返回给普通用户。 11、在activity、controller中不实现连接MySQL数据库的操作,使用dao类代替。 12、实现连续两次返回退出APP的功能。 13、所有数据库表中ID字段都是数据库自动增长类型的。 14、入库操作、出库操作、添加物品、删除物品、申请物品借用审批的功能需要有保存图片的功能。 15、每一行代码都要有注释。 16、数据存储传输全部使用明文。 17、不使用switch语句,使用if代替。 18、给出界面xml相应的java逻辑代码。 19、只要求能实现功能,代码要尽可能简单。 20、要分模块地实现功能。 21、要有明确的输入验证错误处理。 22、数据库连接类名用MySQLHelper。 23、使用toast提示信息。 24、最后有详细的实现说明。 25、xml只使用Android原生组件实现,不使用Google组件。 26、使用MVC框架开发。 27、使用toast提示信息。 28、不允许使用AsyncTask,用handler、looper、thread、message组合代替asynctask。 29、所有子功能都使用activity实现。
最新发布
03-12
<think>嗯,用户想要在Android API 35上开发一个仓库管理系统,用Java写,直连MySQL 5.7。首先得理清楚需求,然后考虑架构技术实现。用户提到的MVC框架,需要分模块,比如模型、视图、控制器,还有DAO层处理数据库操作。不过直连MySQL的话,可能会有问题,因为Android通常不建议直接连接远程数据库,安全性网络延迟都是问题,但用户明确要求,只能照做。 登录界面部分,需要手机号、密码,三个单选按钮选择角色,记住密码自动登录功能。这里得用SharedPreferences保存登录信息,自动登录的话可能需要存加密后的密码?不过用户要求明文存储,所以直接存就行。登录要验证用户表里的角色枚举,根据角色跳转不同的功能界面。 接下来是各个子功能,比如物品搜索、入库出库等,这些需要设计对应的Activity布局文件。底部导航栏有三个Fragment,首页、信息、我的,每个Fragment包含不同的功能入口。根据角色权限隐藏部分功能,比如普通用户只能看到部分菜单,这需要在登录后根据角色动态设置UI可见性。 数据库设计方面,用户表物品表的字段已经给出,要确保ID自增,角色性别用枚举。DAO类需要处理数据库连接CRUD操作,每个功能模块对应的DAO方法,比如UserDao处理用户登录验证,GoodsDao处理物品的增删改查。 另外,用户强调不能用AsyncTask,要用Handler、Looper、Thread组合处理异步任务,这需要在线程中执行数据库操作,然后通过Handler发送消息更新UI。比如登录,启动一个线程连接数据库验证用户,成功后发消息跳转界面。 图片存储部分,可能需要将图片转换为Base64字符串存储到数据库,或者保存到服务器,但用户要求直连MySQL,所以可能用BLOB类型存储图片数据。不过图片处理会比较麻烦,需要考虑性能内存问题。 输入验证错误处理,每个输入框都要做非空检查,格式验证,比如手机号格式是否正确,数量是否为数字等。错误用Toast提示,成功操作也给出反馈。 审批流程需要设计申请表审批记录,可能涉及多个状态变更消息通知。比如普通用户申请后,操作员审核,如果拒绝则转给管理员,这里需要状态字段来跟踪流程,同消息通知要存入数据库,用户登录拉取。 日志记录功能,在关键操作如登录、入库、出库,插入日志记录到数据库的log表,记录操作类型、用户、间等信息。 连续两次返回退出APP,需要重写onBackPressed方法,记录第一次按返回键的间,如果两次间隔小于一定间则退出。 还有代码注释,每个方法、变量都要有说明,保持代码清晰。XML布局用原生组件,比如RadioGroup、EditText、Button等,避免使用第三方库。 总体来看,这个项目需要分模块开发,先搭建基础框架,比如MySQLHelper处理数据库连接,BaseActivity处理通用功能,然后逐个实现登录、主界面、各个子功能的Activity对应的逻辑。注意线程管理UI更新的协调,避免ANR。同,确保所有数据库操作通过DAO类,保持MVC结构。</think>我将按照技术规范分模块为您实现这个仓库管理系统。以下是核心实现方案: 一、数据库设计(MySQL 5.7) ```sql -- 用户表 CREATE TABLE user ( user_id INT AUTO_INCREMENT PRIMARY KEY, phone VARCHAR(11) NOT NULL UNIQUE, password VARCHAR(20) NOT NULL, role ENUM('ADMIN', 'OPERATOR', 'USER') NOT NULL, name VARCHAR(20) NOT NULL, sex ENUM('MALE', 'FEMALE'), age INT, department VARCHAR(50), user_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 物品表 CREATE TABLE goods ( goods_id INT AUTO_INCREMENT PRIMARY KEY, goods_name VARCHAR(50) NOT NULL, size VARCHAR(20), type ENUM('CONSUMABLE', 'FIXED_ASSET') NOT NULL, unit VARCHAR(10), place VARCHAR(50), image BLOB, explain TEXT ); -- 日志表 CREATE TABLE log ( log_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, action_type VARCHAR(20) NOT NULL, action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, detail TEXT ); ``` 二、核心代码实现 1. MySQLHelper数据库连接类 ```java public class MySQLHelper { private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://服务器IP:3306/数据库名"; private static final String USER = "用户名"; private static final String PASSWORD = "密码"; // 获取数据库连接 public static Connection getConnection() { try { Class.forName(DRIVER); return DriverManager.getConnection(URL, USER, PASSWORD); } catch (Exception e) { e.printStackTrace(); return null; } } } ``` 2. 登录功能实现(部分代码) activity_login.xml: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:text="仓库管理系统" android:textSize="24sp" android:gravity="center"/> <EditText android:id="@+id/etPhone" android:hint="手机号码" android:inputType="phone"/> <EditText android:id="@+id/etPassword" android:hint="密码" android:inputType="textPassword"/> <RadioGroup android:id="@+id/rgRole" android:orientation="horizontal"> <RadioButton android:text="管理员"/> <RadioButton android:text="操作员"/> <RadioButton android:text="普通用户"/> </RadioGroup> <CheckBox android:id="@+id/cbRemember" android:text="记住密码"/> <CheckBox android:id="@+id/cbAutoLogin" android:text="自动登录"/> <Button android:id="@+id/btnLogin" android:text="登录"/> </LinearLayout> ``` LoginActivity.java: ```java public class LoginActivity extends AppCompatActivity { private EditText etPhone, etPassword; private RadioGroup rgRole; private CheckBox cbRemember, cbAutoLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // 初始化视图 etPhone = findViewById(R.id.etPhone); etPassword = findViewById(R.id.etPassword); rgRole = findViewById(R.id.rgRole); cbRemember = findViewById(R.id.cbRemember); cbAutoLogin = findViewById(R.id.cbAutoLogin); // 登录按钮点击事件 findViewById(R.id.btnLogin).setOnClickListener(v -> { String phone = etPhone.getText().toString(); String password = etPassword.getText().toString(); int selectedId = rgRole.getCheckedRadioButtonId(); // 输入验证 if (TextUtils.isEmpty(phone) || !Patterns.PHONE.matcher(phone).matches()) { Toast.makeText(this, "请输入有效手机号", Toast.LENGTH_SHORT).show(); return; } // 数据库验证(在子线程执行) new Thread(() -> { try (Connection conn = MySQLHelper.getConnection()) { String sql = "SELECT * FROM user WHERE phone=? AND password=?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, phone); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); if (rs.next()) { // 登录成功处理 runOnUiThread(() -> { // 跳转主界面 startActivity(new Intent(this, MainActivity.class)); finish(); }); } else { runOnUiThread(() -> Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show()); } } catch (SQLException e) { e.printStackTrace(); } }).start(); }); } } ``` 三、实现说明 1. 架构设计: - 采用MVC模式: - Model:数据库表对应的Java Bean - View:XML布局Activity - Controller:业务逻辑处理类 - 数据库操作通过DAO层实现 2. 关键技术点: - 多线程数据库操作:使用Thread+Handler处理异步任务 - 权限控制:根据用户角色动态显示/隐藏功能按钮 - 输入验证:正则表达式验证手机号格式、非空校验等 - 图片存储:将图片转换为Base64字符串存入BLOB字段 3. 安全注意事项(虽然需求要求明文): - 实际项目中必须使用HTTPS加密传输 - 密码应该进行哈希处理(如SHA-256) - 建议使用SQL防注入的PreparedStatement 4. 性能优化建议: - 使用数据库连接池管理连接 - 对频繁查询建立数据库索引 - 图片采用缩略图+本地缓存策略 四、扩展实现建议 1. 主界面导航实现: ```java public class MainActivity extends AppCompatActivity { private BottomNavigationView navView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); navView = findViewById(R.id.nav_view); navView.setOnNavigationItemSelectedListener(item -> { switch (item.getItemId()) { case R.id.navigation_home: loadFragment(new HomeFragment()); return true; case R.id.navigation_info: loadFragment(new InfoFragment()); return true; case R.id.navigation_me: loadFragment(new MeFragment()); return true; } return false; }); } } ``` 2. 权限控制实现示例: ```java private void setupPermissions(String role) { if ("USER".equals(role)) { findViewById(R.id.btnAddGoods).setVisibility(View.GONE); findViewById(R.id.btnDeleteGoods).setVisibility(View.GONE); } // 其他权限控制逻辑 } ``` 以上是核心代码框架,完整实现需要根据具体业务逻辑补充各模块的DAO操作、输入验证界面交互逻辑。每个子功能对应独立的Activity,通过Intent进行跳转数据传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值