悟空crm客户管理系统二次开发 单独新增表格字段

news2024/11/24 1:26:39

1,仪表盘(数据来源修改)

注意点:有层级关系,管理员账号可以看到全部数据,主管只能看到下属数据。
在这里插入图片描述

在这里插入图片描述

2、在客户管理菜单里面 增加一个时间筛选、额度汇总

在这里插入图片描述

    /**
     * 获取客户列表
     *
     * @param $type
     * @param $content
     * @return bool|\PDOStatement|string|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    private function getCustomerList($type, $content)
{
    # 默认条件
    $customerWhere = $this->getCustomerWhere();
    
    # 查询条件
    $searchWhere = $this->getSearchWhere($type, $content);
    
    # 查询字段
    $field = ['customer_id', 'name', 'create_time', 'owner_user_id', 'deal_time', 'telephone', 'mobile'];
    
    return db('crm_customer')->alias('customer')->field($field)->where($customerWhere)
        ->where($searchWhere)->limit(10)->order('update_time', 'desc')->select();
}

3,单独新增一个今日数据表格

(以表格的形式呈现出来)
需求:
3.1,需要关联部门和员工层级关系,比如:普通员工只填写自己的数据,部门领导客户看到下面人员所有数据,管理员可以看到所有部门数据。
3.2,条件筛选,时间筛选、部门筛选、员工筛选、全部
3.3,表格可以自定义增删改,自定义隐藏和开启字段
在这里插入图片描述

  public function getDataList($request)
    {
        $userModel = new \app\admin\model\User();
        $structureModel = new \app\admin\model\Structure();
        $fieldModel = new \app\admin\model\Field();
        $customerModel = new \app\crm\model\Customer();
        $search = $request['search'];
        $user_id = $request['user_id'];
        $scene_id = (int)$request['scene_id'];
        $is_excel = $request['is_excel']; //导出
        $order_field = $request['order_field'];
        $order_type = $request['order_type'];
        $pageType = $request['pageType'];
        $getCount = $request['getCount'];
        
        $cstart_time = $request['cstart_time'];
        $cend_time = $request['cend_time'];
        
        //需要过滤的参数
        $unsetRequest = [
            'scene_id', 'search', 'user_id', 'is_excel', 'action', 'order_field', 'order_type', 'is_remind', 'getCount', 'type', 'otherMap', 'business_id', 'check_status'
            ,'cstart_time','cend_time'
        ];
        foreach ($unsetRequest as $v) {
            unset($request[$v]);
        }
        
        $request = $this->fmtRequest($request);
        $requestMap = $request['map'] ?: [];
        
        $sceneModel = new \app\admin\model\Scene();
        if ($scene_id) {
            //自定义场景
            $sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'todaydata') ?: [];
        } else {
            //默认场景
            $sceneMap = $sceneModel->getDefaultData('crm_todaydata', $user_id) ?: [];
        }
        $searchMap = [];
        if ($search || $search == '0') {
            //普通筛选
            $searchMap = function ($query) use ($search) {
                $query->where('todaydata.name', array('like', '%' . $search . '%'))
                    ->whereOr('todaydata.mobile', array('like', '%' . $search . '%'))
                    ->whereOr('todaydata.telephone', array('like', '%' . $search . '%'));
            };
        }
        $partMap = [];
        //优先级:普通筛选>高级筛选>场景
        $teamMap=$requestMap['team_id'];
        //团队成员 高级筛选
        if($teamMap){
            $partMap= advancedQueryFormatForTeam($teamMap,'todaydata','todaydata_id');
            unset($requestMap['team_id']);
            $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;
        } else {
            $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;
        }
        //高级筛选
        $map = advancedQuery($map, 'crm', 'todaydata', 'index');
        //权限

            $a = 'index';
            if ($is_excel) $a = 'excelExport';
            $authMap = [];
            $auth_user_ids = $userModel->getUserByPer('crm', 'todaydata', $a);
            if (isset($map['todaydata.owner_user_id'])) {
                if (!is_array($map['todaydata.owner_user_id'][1])) {
                    $map['todaydata.owner_user_id'][1] = [$map['todaydata.owner_user_id'][1]];
                }
                if (in_array($map['todaydata.owner_user_id'][0], ['neq', 'notin'])) {
                    $auth_user_ids = array_diff($auth_user_ids, $map['todaydata.owner_user_id'][1]) ?: [];    //取差集
                } else {
                    $auth_user_ids = array_intersect($map['todaydata.owner_user_id'][1], $auth_user_ids) ?: [];    //取交集
                }
                unset($map['todaydata.owner_user_id']);
                $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ?: ['-1'];
                //负责人、相关团队
                $authMap['todaydata.owner_user_id'] = ['in', $auth_user_ids];
            } else {
                $authMapData = [];
                $authMapData['auth_user_ids'] = $auth_user_ids;
                $authMapData['user_id'] = $user_id;
                $authMap = function ($query) use ($authMapData) {
                    $query->where('todaydata.owner_user_id', array('in', $authMapData['auth_user_ids']));
                        // ->whereOr('todaydata.ro_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'))
                        // ->whereOr('todaydata.rw_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'));
                };
            }

        $timeWhere = '';
        if($cstart_time){
            $timeWhere .= 'todaydata.create_time>='.strtotime($cstart_time);
        }
        if($cend_time){
            if($timeWhere) $timeWhere .= ' and ';
            $timeWhere .= 'todaydata.create_time<'.strtotime('+1 day', strtotime($cend_time));
        }

        //列表展示字段
        $indexField = $fieldModel->getIndexField('crm_todaydata', $user_id, 1) ?: array('name');
        $userField = $fieldModel->getFieldByFormType('crm_todaydata', 'user'); //人员类型
        $structureField = $fieldModel->getFieldByFormType('crm_todaydata', 'structure');  //部门类型
        $datetimeField = $fieldModel->getFieldByFormType('crm_todaydata', 'datetime'); //日期时间类型
        $booleanField = $fieldModel->getFieldByFormType('crm_todaydata', 'boolean_value'); //布尔值
        $dateIntervalField = $fieldModel->getFieldByFormType('crm_todaydata', 'date_interval'); // 日期区间类型字段
        $positionField = $fieldModel->getFieldByFormType('crm_todaydata', 'position'); // 地址类型字段
        $handwritingField = $fieldModel->getFieldByFormType('crm_todaydata', 'handwriting_sign'); // 手写签名类型字段
        $locationField = $fieldModel->getFieldByFormType('crm_todaydata', 'location'); // 定位类型字段
        $boxField = $fieldModel->getFieldByFormType('crm_todaydata', 'checkbox'); // 多选类型字段
        $floatField = $fieldModel->getFieldByFormType('crm_todaydata', 'floatnumber'); // 货币类型字段
//        $fieldGrant = db('admin_field_mask')->where('types', 'todaydata')->select();
        # 处理人员和部门类型的排序报错问题(前端传来的是包含_name的别名字段)
        $temporaryField = str_replace('_name', '', $order_field);
        if (in_array($temporaryField, $userField) || in_array($temporaryField, $structureField)) {
            $order_field = $temporaryField;
        }
        //排序
        if ($order_type && $order_field) {
            $order = $fieldModel->getOrderByFormtype('crm_todaydata', 'todaydata', $order_field, $order_type);
        } else {
            $order = 'todaydata.update_time desc';
        }
        $readAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'read');
        $updateAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'update');
        $deleteAuthIds = $userModel->getUserByPer('crm', 'todaydata', 'delete');
        $customerWhere = [];
        if ($pageType == !'all') {
            //非客户池条件
            // $customerWhere = $customerModel->getWhereByCustomer();
        }
        $dataCount = db('crm_todaydata')
            ->alias('todaydata')
            ->join('__CRM_CUSTOMER__ customer', 'todaydata.customer_id = customer.customer_id', 'LEFT')
            ->where($map)
            ->where($searchMap)
            ->where($authMap)
            ->where($partMap)
            ->where($customerWhere)
            ->where($timeWhere)
            ->count('todaydata_id');
        if ($getCount == 1) {
            $data['dataCount'] = $dataCount ?: 0;
            return $data;
        }
        
        $statisticsField = [
            'sum(jrxh) as total_jrxh',
            'sum(jrjfrs) as total_jrjfrs',
            'sum(zsy) as total_zsy',
            'sum(total_follow_buy) as total_total_follow_buy',
            'sum(yxkh) as total_yxkh',
            'sum(zgm) as total_zgm',
        ];
        if($dataCount > 0){
            $statisticsField[] = 'ROUND(sum(zhl) / '.$dataCount.', 2) as total_zhl';
        }else{
            $statisticsField[] = '0 as total_zhl';
        }
        $statistics = db('crm_todaydata')->alias('todaydata')
                                    ->field($statisticsField)
                        			->where($map)
                                    ->where($searchMap)
                                    ->where($partMap)
                                    ->where($authMap)
                                    ->where($customerWhere)
                                    ->where($timeWhere)
                        			->find();
        if(!$statistics){
            $statistics = [
                'total_jrxh' => 0,
                'total_jrjfrs' => 0,
                'total_zsy' => 0,
                'total_total_follow_buy' => 0,
                'total_yxkh' => 0,
                'total_zgm' => 0,
                'total_zhl' => 0,
            ];
        }

        $list = db('crm_todaydata')
            ->alias('todaydata')
            ->join('__CRM_CUSTOMER__ customer', 'todaydata.customer_id = customer.customer_id', 'LEFT')
            ->where($map)
            ->where($searchMap)
            ->where($partMap)
            ->where($authMap)
            ->where($customerWhere)
            ->where($timeWhere)
            ->limit($request['offset'], $request['length'])
            ->field('todaydata.*,customer.name as customer_name')
            ->orderRaw($order)
            ->select();
        # 扩展数据
        $extraData = [];
        $todaydata_id_list = !empty($list) ? array_column($list, 'todaydata_id') : [];
        $grantData = getFieldGrantData($user_id);
        foreach ($grantData['crm_todaydata'] as $key => $value) {
            foreach ($value as $ke => $va) {
                if($va['maskType']!=0){
                    $fieldGrant[$ke]['maskType'] = $va['maskType'];
                    $fieldGrant[$ke]['form_type'] = $va['form_type'];
                    $fieldGrant[$ke]['field'] = $va['field'];
                }
            }
        }
        foreach ($list as $k => $v) {
            $list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : [];
            $list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : [];
            $list[$k]['customer_id_info']['customer_id'] = $v['customer_id'] ?: '';
            $list[$k]['customer_id_info']['name'] = $v['customer_name'] ?: '';
            foreach ($userField as $key => $val) {
                $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : [];
                $list[$k][$val] = implode($usernameField, ',');
            }
            foreach ($structureField as $key => $val) {
                $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : [];
                $list[$k][$val] = implode($structureNameField, ',');
            }
            foreach ($datetimeField as $key => $val) {
                $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null;
            }
            foreach ($booleanField as $key => $val) {
                $list[$k][$val] = !empty($v[$val]) ? (string)$v[$val] : '0';
            }
            // 处理日期区间类型字段的格式
            foreach ($dateIntervalField as $key => $val) {
                $list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;
            }
            // 处理地址类型字段的格式
            foreach ($positionField as $key => $val) {
                $list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;
            }
            // 手写签名类型字段
            foreach ($handwritingField as $key => $val) {
                $handwritingData = !empty($v[$val]) ? db('admin_file')->where('file_id', $v[$val])->value('file_path') : null;
                $list[$k][$val] = ['url' => !empty($handwritingData) ? getFullPath($handwritingData) : null];
            }
            // 定位类型字段
            foreach ($locationField AS $key => $val) {
                $list[$k][$val] = !empty($extraData[$v['todaydata_id']][$val]) ? json_decode($extraData[$v['todaydata_id']][$val], true) : null;
            }
            // 多选框类型字段
            foreach ($boxField AS $key => $val) {
                $list[$k][$val] = !empty($v[$val]) ? trim($v[$val], ',') : null;
            }
            // 货币类型字段
            foreach ($floatField AS $key => $val) {
                $list[$k][$val] = $v[$val]!='0.00' ? (string)$v[$val] : null;
            }
            //掩码相关类型字段
            foreach ($fieldGrant AS $key => $val){
                //掩码相关类型字段
                if ($val['maskType']!=0 && $val['form_type'] == 'mobile') {
                    $pattern = "/(1[3458]{1}[0-9])[0-9]{4}([0-9]{4})/i";
                    $rs = preg_replace($pattern, "$1****$2", $v[$val['field']]);
                    $list[$k][$val['field']] = !empty($v[$val['field']]) ? (string)$rs : null;
                } elseif ($val['maskType']!=0 && $val['form_type'] == 'email') {
                    $email_array = explode("@", $v[$val['field']]);
                    $prevfix = (strlen($email_array[0]) < 4) ? "" : substr($v[$val['field']], 0, 2); //邮箱前缀
                    $str = preg_replace('/([\d\w+_-]{0,100})@/', "***@", $v[$val['field']], -1, $count);
                    $rs = $prevfix . $str;
                    $list[$k][$val['field']] = !empty($v[$val['field']]) ?$rs: null;
                } elseif ($val['maskType']!=0 && in_array($val['form_type'],['position','floatnumber'])) {
                    $list[$k][$val['field']] = !empty($v[$val['field']]) ? (string)substr_replace($v[$val['field']], '*****',0,strlen($v[$val['field']])) : null;
                }
            }
            //权限
            $permission = [];
            $is_read = 0;
            $is_update = 0;
            $is_delete = 0;
            if (in_array($v['owner_user_id'], $readAuthIds)) $is_read = 1;
            if (in_array($v['owner_user_id'], $updateAuthIds)) $is_update = 1;
            if (in_array($v['owner_user_id'], $deleteAuthIds)) $is_delete = 1;
            $permission['is_read'] = $is_read;
            $permission['is_update'] = $is_update;
            $permission['is_delete'] = $is_delete;
            $list[$k]['permission'] = $permission;
            
            # 关注
            $starWhere = ['user_id' => $user_id, 'target_id' => $v['todaydata_id'], 'type' => 'crm_todaydata'];
            $star = Db::name('crm_star')->where($starWhere)->value('star_id');
            $list[$k]['star'] = !empty($star) ? 1 : 0;
            # 日期
            // $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null;
            $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d', $v['create_time']) : null;
            $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null;
            $list[$k]['last_time'] = !empty($v['last_time']) ? date('Y-m-d H:i:s', $v['last_time']) : null;
            # 创建人
            $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : '';
            # 负责人
            $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : '';

            # 系统字段  负责人部门   zjf  20210726
            $list[$k]['owner_user_structure_name'] = $list[$k]['owner_user_id_info']['structure_name'];
        }
        $data = [];
        $data['list'] = $list;
        $data['dataCount'] = $dataCount ?: 0;
        $data['statistics'] = $statistics ?: [];
        return $data;
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二次开发增加的条件筛选:

时间筛选、部门筛选、员工筛选、全部
在这里插入图片描述

  /**
     * 获取查询条件
     *
     * @param $type
     * @param $content
     * @return array|\Closure
     */
    private function getSearchWhere($type, $content)
{
    $searchWhere = [];
    
    # 查询客户名称
    if ($type == 'name') {
        $searchWhere = function ($query) use ($content) {
            $query->where('name', 'like', '%' . $content . '%');
        };
    }
    
    # 查询手机或电话
    if ($type == 'phone') {
        $searchWhere = function ($query) use ($content) {
            $query->where(function ($query) use ($content) {
                $query->whereOr('telephone', $content);
                $query->whereOr('mobile', $content);
            });
        };
    }
    
    return $searchWhere;
}

悟空crm客户管理系统二次开发
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2135580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线API文档,技术文档工具源码ShowDoc

ShowDoc是一个非常适合IT团队的在线API文档、技术文档工具。通过showdoc&#xff0c;你可以方便地使用markdown语法来书写出美观的API文档、数据字典文档、技术文档、在线excel文档等等。 代码下载

单机docker-compose部署minio

单机多副本docker-compose部署minio 简单介绍 如果服务器有限可以单机挂载多硬盘实现多副本容错&#xff08;生产不推荐&#xff09; 部署好的文件状态 有两个重要文件 docker-compose.yaml和nginx.conf docker-compose.yaml是docker部署容器的配置信息包括4个minio和1个ng…

云微客全流程闭环,实现在短视频营销中快速拿结果

不知道大家有没有在抖音或者是其他短视频平台见过这样的视频&#xff0c;这一类的视频制作的非常简单&#xff0c;只有一个简单的文字搭配上背景素材&#xff0c;但是它的播放量和互动量却是惊人的好。在短视频领域的朋友想必有过这样心声&#xff0c;这么好的播放量&#xff0…

USB虚拟串口——CDC ACM 虚拟串口(不使用 IAD)

文章目录 CDC ACM 虚拟串口实现描述符结构设备描述符配置描述符集合配置描述符接口 1 的描述符接口描述符类特殊描述符输入端点描述符接口 2 的描述符接口描述符输出端点描述符输入端点描述符类特殊请求set control line statusget line codingset line codingCDC 数据交互主机…

【数据结构】之排序

&#x1f3c0;&#x1f3c0;&#x1f3c0;来都来了&#xff0c;不妨点个关注&#xff01; &#x1f3a7;&#x1f3a7;&#x1f3a7;博客主页&#xff1a;欢迎各位大佬! 文章目录 1 排序1.1 排序的概念1.2 几种常见的排序算法&#xff1a; 2 常见排序算法的实现2.1 插入排序2.…

Java项目: 基于SpringBoot+mybatis+maven美发门店管理系统(含源码+数据库+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven美发门店管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

Java在零工市场中的应用:构建灵活高效的劳动力平台

随着数字经济的迅猛发展&#xff0c;零工经济作为一种新兴的劳动力市场模式&#xff0c;正在全球范围内迅速崛起。零工市场通过互联网平台将服务提供者与需求者进行快速匹配&#xff0c;使得个人可以临时、自由地提供服务&#xff0c;企业则能够按需雇佣劳动力&#xff0c;实现…

总算学到路由了————vue3中路由介绍

基本创建步骤 下载vue-router的依赖&#xff1a;npm install vue-router4 创建好路由组件&#xff0c;放在pages/views里面 &#xff08;views 文件夹通常包含应用的页面。这些页面通常是与路由相对应的组件&#xff0c;代表应用的不同视图&#xff0c;components 文件夹通…

基于yolov8的行人过马路危险行为检测告警系统python源码+onnx模型+精美GUI界面

【算法介绍】 基于YOLOv8的行人过马路危险行为检测告警系统是一种高效、精准的智能交通监控解决方案。该系统利用YOLOv8这一前沿的目标检测算法&#xff0c;能够快速识别图像或视频中的行人&#xff0c;并准确判断其是否存在过马路时的危险行为&#xff0c;如玩手机、打电话等…

MySQL 查询数据库的数据总量

需求&#xff1a;查看MySQL数据库的数据总量&#xff0c;以MB为单位展示数据库占用的磁盘空间 实践&#xff1a; 登录到MySQL数据库服务器。 选择你想要查看数据总量的数据库&#xff1a; USE shield;运行查询以获取数据库的总大小&#xff1a; SELECT table_schema AS Datab…

抖音视频下载

对于特别喜欢的视频有时需要珍藏&#xff0c;下文方法可能会帮到你&#xff0c;但要注意尊重版权和遵守相关声明。 Edge浏览器打开抖音短视频&#xff0c;按F12&#xff0c;选择 网络&#xff1b;筛选条件?a&#xff1b;双击搜索结果打开视频&#xff1b;选择想要的视频&…

SpringBoot框架下的房产销售系统开发

第一章 绪 论 1.1背景及意义 房产销售也都将通过计算机进行整体智能化操作&#xff0c;对于房产销售系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、个人中心、用户管理、销售经理管理、房源信息管理、房源类型管理、房子户型管理、交易订单管…

aspcms webshell漏洞复现

1.【ip】/admin_aspcms/login.asp访问后台&#xff0c;admin 123456 登录 2.点击【扩展功能】【幻灯片设置】点击【保存】开启代理进行抓包 3.在抓取的数据包中修改 slideTextStatus 字段的值为以下代码并进行发包 访问影响文件 字段值 1%25><%25Eval(Request (chr(65))…

FastAPI 中的错误处理:如何让错误信息更有价值

开头&#xff1a; 下面详细介绍如何在 FastAPI 中实现有效的错误处理策略。我们将讨论使用 HTTPException 来抛出带有详细描述的错误&#xff0c;定义 Pydantic 模型来结构化错误响应&#xff0c;以及如何通过自定义异常处理器来统一处理错误。此外&#xff0c;我们还将展示如…

LNMP的简单安装(ubuntu)

LNMP介绍 LNMP 是一种常见的开源软件组合&#xff0c;用于搭建高效的网站服务器环境。LNMP 代表以下四个组件&#xff1a; Linux&#xff1a;操作系统。Linux 是一种稳定、可靠、安全的开源操作系统&#xff0c;常用于服务器环境&#xff0c;特别是在企业级部署中。它负责底层…

深度学习张量变换操作利器 einops 基础实践

今天在一个项目调试的时候无意间报错&#xff1a; 以前其实并没有怎么多接触过einops&#xff0c;今天正好碰到了&#xff0c;就简单总结记录下。 解决上面的报错很简单&#xff0c;直接pip安装即可&#xff1a; einops 是一个用于操作张量的库&#xff0c;它提供了一种简洁且…

Ansys HFSS的边界条件与激励端口

本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…

【F的领地】项目拆解:科普类账号基础运营教程 | 学会使用工具 “偷懒” | 文字成片功能

初中同学&#xff0c;做了个科普类账号&#xff0c;半年转化了十几个&#xff0c;引发了我的兴趣。 账号也不做私域转化&#xff0c;而且就靠抖音橱窗…… 我这种天天和平台机制斗智斗勇的&#xff0c;看到能和平台同频的&#xff0c;不自然地感兴趣。 于是我就去问了一下细…

淘宝接连出招,电商平台开始卷营商环境了

文丨郭梦仪 商家苦“内卷”已久&#xff0c;电商平台终于出手了。 过去一年多时间里&#xff0c;商家先后被卷入到各种竞争中&#xff1a;拼绝对低价、仅退款&#xff0c;在带给消费者性价比更高的产品的同时&#xff0c;也成为一部分人薅羊毛的工具。 在某些平台上长时间的…

开发用户注册接口

用户表基本结构 用户头像存放在三方服务器&#xff0c;显示三方服务器地址 Java采访驼峰命名方法&#xff0c;数据库采用下划线命名法。 自动生成get、set方法的工具 lombok&#xff1a;在编译阶段&#xff0c;为实体类自动生成setter getter toString 使用步骤&#xff1…