uniapp前端写了注册对接到Webman Admin自带用户管理,根据ai给出的方案无法成功

ali

一、新增数据库字段

-- 添加用户来源及第三方登录字段
ALTER TABLE `wa_users`
ADD COLUMN `source` varchar(32) COLLATE utf8mb4_general_ci DEFAULT 'web' COMMENT '用户来源(web/miniprogram/app)' AFTER `status`,
ADD COLUMN `openid` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序openid' AFTER `source`,
ADD COLUMN `unionid` varchar(64) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '小程序unionid' AFTER `openid`,
ADD COLUMN `register_ip` varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '注册IP' AFTER `unionid`,
ADD COLUMN `register_time` datetime DEFAULT NULL COMMENT '注册时间' AFTER `register_ip`;

-- 添加索引
ALTER TABLE `wa_users`
ADD INDEX `idx_source` (`source`),
ADD UNIQUE INDEX `idx_openid` (`openid`),
ADD INDEX `idx_register_time` (`register_time`);

二、后端实现(Webman Admin)

  1. 控制器 app/admin/controller/Miniprogram.php
    因Webman Admin插件目录app/admin不存在,所以在/www/wwwroot/webman/plugin/admin/app/controller新建了Miniprogram.php
    
    <?php
    namespace app\admin\controller;

use app\admin\model\WaUsers;
use support\Request;
use Respect\Validation\Validator as v;
use Webman\Redis;

class Miniprogram
{
/**

  • 小程序用户注册
    */
    public function register(Request $request)
    {
    // 验证请求数据
    $validator = v::key('username', v::stringType()->length(4, 20))
    ->key('password', v::stringType()->length(6, 32));

    try {
        $validator->assert($request->post());
    } catch (\Exception $e) {
        return json(['code' => 400, 'msg' => $e->getMessage()]);
    }
    
    $username = $request->post('username');
    $password = $request->post('password');
    $ip = $request->getRealIp();
    
    // 检查用户名是否已存在
    if (WaUsers::where('username', $username)->exists()) {
        return json(['code' => 400, 'msg' => '用户名已存在']);
    }
    
    // 检查IP注册频率(防批量注册)
    $redisKey = "register:ip:{$ip}";
    $registerCount = Redis::get($redisKey) ?: 0;
    
    if ((int)$registerCount >= 5) {
        return json(['code' => 403, 'msg' => '注册过于频繁,请稍后再试']);
    }
    
    // 增加IP注册计数(有效期1小时)
    Redis::incr($redisKey);
    Redis::expire($redisKey, 3600);
    
    try {
        // 创建用户
        $user = WaUsers::create([
            'username' => $username,
            'password' => password_hash($password, PASSWORD_DEFAULT),
            'nickname' => $username,
            'source' => 'miniprogram',
            'register_ip' => $ip,
            'register_time' => date('Y-m-d H:i:s'),
            'join_time' => date('Y-m-d H:i:s'),
            'join_ip' => $ip,
            'status' => 1, // 启用状态
            'role' => 1,   // 普通用户角色
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);
    
        return json([
            'code' => 200, 
            'msg' => '注册成功',
            'data' => ['user_id' => $user->id]
        ]);
    } catch (\Exception $e) {
        return json(['code' => 500, 'msg' => '注册失败,请重试']);
    }

    }
    }

    
    2. 路由配置 app/admin/route/route.php
    因为app/admin下没有route文件夹,route。php在/www/wwwroot/webman/plugin/admin/config目录下,所以在/www/wwwroot/webman/plugin/admin/config/route.php添加了
    ```php
    use support\Route;

// 小程序接口
Route::group('/api/miniprogram', function () {
Route::post('/register', [\app\admin\controller\Miniprogram::class, 'register']);
});

### 完整内容如下:
```php
<?php

use plugin\admin\app\controller\AccountController;
use plugin\admin\app\controller\DictController;
use Webman\Route;
use support\Request;
use support\Route;

// 小程序接口
Route::group('/api/miniprogram', function () {
    Route::post('/register', [\app\admin\controller\Miniprogram::class, 'register']);
});

Route::any('/app/admin/account/captcha/{type}', [AccountController::class, 'captcha']);

Route::any('/app/admin/dict/get/{name}', [DictController::class, 'get']);

Route::fallback(function (Request $request) {
    return response($request->uri() . ' not found' , 404);
}, 'admin');

到这一步,后台就打不开了,给的步骤还没执行完

519 1 0
1个回答

JustForFun

看了下你上一条提问,能不能学会自己写代码看报错。。。

  1. 命名空间应该是namespace plugin\admin\app\controller;
  2. 路由直接写在plugin/admin/config/route.php就可以;
  3. 业务代码没空看,自己修复;

这不接口就通了?

截图

  • ali 2025-06-20

    谢谢

  • vs7717 2025-06-21

    还是你有空

  • JustForFun 2025-06-23

    一两分钟的事,就靠网友贡献的错误示例来增加自己的项目经验[手动滑稽]

🔝