前端项目加载对象储存文件跨域问题解决。nginx配置
location /file/ {
rewrite ^/file(/.*)$ $1 break;
proxy_pass https://english-1316546603.cos.ap-singapore.myqcloud.com;
}
技术文章收藏
docker挂载volume的用户权限问题,理解docker容器的uid
docker-compose 指定用户
version: '3'
services:
hyperf:
image: dev-mineadmin-hyperf
restart: always
environment:
- "TIMEZONE=Asia/Shanghai"
- "APP_PROJECT=mineadmin-hyperf-dev"
- "APP_SYSTEM_ENV=docker"
working_dir: "/opt/www"
user: ubuntu
ports:
- 7501:7501
- 7502:7502
- 7503:7503
volumes:
- .:/opt/www
networks:
default:
name: dev-mineadmin-hyperf
dockerfile alpine 创建用户赋予sudo权限
RUN apk add --no-cache sudo
# 添加新用户 ubuntu
RUN adduser -D -s /bin/sh ubuntu
# 将新用户添加到 sudoers 列表,允许其无需密码执行 sudo 命令
# 注意:这里直接 echo 写入 sudoers 文件,实际使用中应使用 visudo 来避免配置错误
RUN echo 'ubuntu ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/ubuntu \
&& chmod 0440 /etc/sudoers.d/ubuntu && su - ubuntu
hyperf 代理缓存类 开发环境处理
在开发环境
dockerfile SCAN_CACHEABLE 要设置为false
ENV TIMEZONE=${timezone:-"Asia/Shanghai"} \
SCAN_CACHEABLE=(false)
官方文档
所有被 AOP 影响的类,都会在 ./runtime/container/proxy/ 文件夹内生成对应的 代理类缓存,是否在启动时自动生成取决于 config/config.php 配置文件中 scan_cacheable 配置项的值,默认值为 false,如果该配置项为 true 则 Hyperf 不会扫描和生成代理类缓存,而是直接以现有的缓存文件作为最终的代理类。如果该配置项为 false,则 Hyperf 会在每次启动应用时扫描注解扫描域并自动的生成对应的代理类缓存,当代码发生变化时,代理类缓存也会自动的重新生成。
通常在开发环境下,该值为 false,这样更便于开发调试,而在部署生产环境时,我们可能会希望 Hyperf 提前将所有代理类提前生成,而不是使用时动态的生成,可以通过 php bin/hyperf.php 命令来生成所有代理类,然后再通过环境变量 SCAN_CACHEABLE 为 true 修改该配置项的值,以达到启动时间更短、应用内存占用更低的目的。
说明
如果开发环境使用docker启动
构建镜像的时候 SCAN_CACHEABLE=(false)
这样 每次启动 容器 ,应用时扫描注解扫描域并自动的生成对应的代理类缓存
mineadmin mapper使用
SystemMenuMapper
/**
* 获取子孙menus.
*/
public function getDescendantsMenus(int $id): array
{
$params = ['level' => $id];
return $this->handleSearch($this->model::query(), $params)->get()->toArray();
}
/**
* 搜索处理器.
*/
public function handleSearch(Builder $query, array $params): Builder
{
if (isset($params['status']) && filled($params['status'])) {
$query->where('status', $params['status']);
}
if (isset($params['level']) && filled($params['level'])) {
$query->where('level', 'like', '%' . $params['level'] . '%');
}
if (isset($params['name']) && filled($params['name'])) {
$query->where('name', 'like', '%' . $params['name'] . '%');
}
if (isset($params['created_at']) && filled($params['created_at']) && is_array($params['created_at']) && count($params['created_at']) == 2) {
$query->whereBetween(
'created_at',
[$params['created_at'][0] . ' 00:00:00', $params['created_at'][1] . ' 23:59:59']
);
}
if (isset($params['noButton']) && filled($params['noButton']) && $params['noButton'] === true) {
$query->where('type', '<>', SystemMenu::BUTTON);
}
return $query;
}
git filemode false
安全目录
git config --global --add safe.directory /var/www/html
忽略文件属性
git config --global core.filemode false
密码
git config --global credential.helper store