当前位置: 首页 > news >正文

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档

Alfresco Content Services简介

Alfresco Content Services(简称ACS)是一款功能完备的企业内容管理(ECM)解决方案,主要面向那些对企业级内容管理有高要求的组织。具体如下:

  1. 核心优势:具备企业级的可扩展性、高性能,用于管理企业关键业务内容并确保合规性。这意味着企业在业务规模不断扩大、内容数据量持续增长的情况下,Alfresco Content Services能稳定高效运行,同时时刻满足企业在数据安全、法规遵循等方面的要求。
  2. 主要用途:可应用于多种场景。包括内容和治理服务,帮助企业管理内容的整个生命周期,从创建、存储到最终删除,确保符合法规和企业内部政策;支持上下文搜索和洞察,用户能基于内容的上下文关系进行精准搜索,挖掘有价值的信息;还能轻松与其他应用集成,打破信息孤岛,提升企业整体业务流程的连贯性和效率。
  3. 关键能力:围绕内容管理提供丰富的功能。在文档管理方面,实现文档的存储、版本控制、权限设置等基础操作;支持文档扫描和捕获,便于将纸质文档转化为数字化信息纳入管理体系;企业协作功能促进团队成员间的协同工作,共同处理和编辑文档;信息治理保障企业信息资产的安全合规;智能分析和洞察则通过对内容的深入挖掘,为企业决策提供数据支持。

Alfresco Content Services是一款功能强大的企业内容管理系统,以下是其官方简介:

  • 功能全面
    • 企业级内容管理:为企业提供了全面的文档管理功能,可实现对大量文件和文档的高效存储、共享、版本控制等操作,满足企业对业务关键内容的管理需求,确保内容的安全性和合规性。
    • 智能流程管理:紧密集成流程与内容服务功能,能够简化以内容为中心的业务流程,让企业在处理文档等内容时,流程更加顺畅,从而支持更快、更明智的决策制定。
    • 企业协作功能:可与Microsoft 365和Google Docs等无缝集成,为团队提供强大的企业协作工具,让团队成员能在不同平台上协同工作,提高工作效率。
    • 信息治理:Alfresco Governance Services能够自动管理信息生命周期,减少用户干预,降低企业业务风险,增强合规性,确保企业信息资产的安全和有序管理。
    • 智能分析:能够自动提取内容中的有价值信息,对内容和元数据进行自动丰富,为企业提供关键洞察,帮助企业更好地理解和利用其内容资产。
  • 技术优势
    • 基于开放标准和API:以开放标准和API为基础构建,易于与其他系统集成和定制,能轻松满足不同企业的多样化业务需求,可与企业现有的IT架构进行无缝对接。
    • 容器化与微服务架构:采用容器化与微服务架构,借助Docker确保应用的轻量化与可移植性,通过Kubernetes或Docker Compose进行编排,增强了系统的弹性和可扩展性,方便在不同环境中部署和运行。
  • 应用场景广泛
    • 云部署:能在公有云或私有云中快速搭建内容管理系统,灵活应对云环境下的弹性资源需求,帮助企业充分利用云的优势进行内容管理。
    • 开发与测试环境:为开发团队提供了快速搭建一致性环境的能力,有助于加速软件开发生命周期,提高开发和测试效率。
    • 多环境部署管理:在不同的测试、预生产、生产环境中,能够高效同步配置,减少人工错误,确保各个环境的稳定性和一致性。
https://docs.alfresco.com/content-services   #官网https://github.com/Alfresco/acs-deployment.git   #github

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

前提条件

操作系统:unbuntu22.04

在开始之前,需要确保已经安装了 Docker 和 Docker Compose。Docker 用于创建和管理容器,Docker Compose 则用于定义和运行多容器的 Docker 应用。
在这里插入图片描述
在这里插入图片描述
测试验证之前把所有的之前的docker容器关掉或者删除,要不然会有端口冲突!

1. 创建目录结构

首先,创建一个目录来存放相关的配置文件和数据,例如:

mkdir alfresco-docker
cd alfresco-docker

2. 创建 docker-compose.yml 文件

在 alfresco-docker 目录下创建一个 docker-compose.yml 文件,以下是一个基本的示例配置:

# This docker-compose.yml file is used to spin up an Alfresco Content Services (ACS) trial cluster on a local host or on a server and it requires a minimum of 16GB Memory to distribute among containers.# To use this file to create a local installation of Alfresco Content Services, you need to have Docker Compose installed [https://docs.docker.com/compose/install/].
# Navigate to the folder where this file is located, and issue the following commands:
#
#     docker login quay.io -u="alfresco+acs_v6_trial" -p="MDF9RNGUJPKZ83KK8UVGUVWO9AYKUZ0VN6WG5VOOCUT6BX19JJLU5ZL0HKU7N20C"
#     docker-compose up
## For additional information about using this docker-compose file, please see:
# https://github.com/Alfresco/acs-deployment/blob/master/docs/docker-compose-deployment.md# You may wish to limit container memory and assign a certain percentage to JVM. There are couple of ways to allocate JVM Memory for ACS Containers
# For example: 'JAVA_OPTS: "$JAVA_OPTS -XX:+PrintFlagsFinal -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"'
# If container memory is not explicitly set, then the above flags will default max heap to 1/4th of container's memory.
version: "2"
services:alfresco:image: quay.io/alfresco/alfresco-content-repository:23.2.1mem_limit: 1900menvironment:JAVA_TOOL_OPTIONS: -Dencryption.keystore.type=JCEKS -Dencryption.cipherAlgorithm=DESede/CBC/PKCS5Padding -Dencryption.keyAlgorithm=DESede -Dencryption.keystore.location=/usr/local/tomcat/shared/classes/alfresco/extension/keystore/keystore -Dmetadata-keystore.password=mp6yc0UD9e -Dmetadata-keystore.aliases=metadata -Dmetadata-keystore.metadata.password=oKIWzVdEdA -Dmetadata-keystore.metadata.algorithm=DESedeJAVA_OPTS: "-Ddb.driver=org.postgresql.Driver-Ddb.username=alfresco-Ddb.password=alfresco-Ddb.url=jdbc:postgresql://postgres:5432/alfresco-Dindex.subsystem.name=elasticsearch-Delasticsearch.createIndexIfNotExists=true-Delasticsearch.host=elasticsearch-Delasticsearch.port=9200-Dshare.host=127.0.0.1-Dshare.port=8080-Dalfresco.host=localhost-Dalfresco.port=8080-Dcsrf.filter.enabled=false-Daos.baseUrlOverwrite=http://localhost:8080/alfresco/aos-Dmessaging.broker.url=\"failover:(nio://activemq:61616)?timeout=3000&jms.useCompression=true\"-Ddeployment.method=DOCKER_COMPOSE-Dtransform.service.enabled=true-Dtransform.service.url=http://transform-router:8095-Dsfs.url=http://shared-file-store:8099/-DlocalTransform.core-aio.url=http://transform-core-aio:8090/-Ddsync.service.uris=http://localhost:9090/alfresco-DtrialUid=id10718692-XX:MinRAMPercentage=50-XX:MaxRAMPercentage=80"healthcheck:test:- CMD- curl- -f- http://localhost:8080/alfresco/api/-default-/public/alfresco/versions/1/probes/-ready-interval: 30stimeout: 3sretries: 3start_period: 1mtransform-router:mem_limit: 512mimage: quay.io/alfresco/alfresco-transform-router:4.1.2environment:JAVA_OPTS: -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80ACTIVEMQ_URL: nio://activemq:61616CORE_AIO_URL: http://transform-core-aio:8090FILE_STORE_URL: http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/fileports:- "8095:8095"depends_on:- activemqtransform-core-aio:image: alfresco/alfresco-transform-core-aio:5.1.2mem_limit: 1536menvironment:JAVA_OPTS: -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80ACTIVEMQ_URL: nio://activemq:61616FILE_STORE_URL: http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/fileports:- "8090:8090"depends_on:- activemqshared-file-store:image: quay.io/alfresco/alfresco-shared-file-store:4.1.2mem_limit: 512menvironment:JAVA_OPTS: -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80scheduler.content.age.millis: 86400000scheduler.cleanup.interval: 86400000ports:- "8099:8099"volumes:- shared-file-store-volume:/tmp/Alfresco/sfsshare:image: quay.io/alfresco/alfresco-share:23.2.1mem_limit: 1genvironment:REPO_HOST: "alfresco"REPO_PORT: "8080"JAVA_OPTS: -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80 -Dalfresco.host=localhost -Dalfresco.port=8080 -Dalfresco.context=alfresco -Dalfresco.protocol=httppostgres:image: postgres:14.4mem_limit: 512menvironment:- POSTGRES_PASSWORD=alfresco- POSTGRES_USER=alfresco- POSTGRES_DB=alfrescocommand: postgres -c max_connections=300 -c log_min_messages=LOGports:- "5432:5432"elasticsearch:image: elasticsearch:7.10.1environment:- xpack.security.enabled=false- discovery.type=single-nodeulimits:memlock:soft: -1hard: -1nofile:soft: 65536hard: 65536cap_add:- IPC_LOCKports:- 9200:9200- 9300:9300search:image: quay.io/alfresco/alfresco-elasticsearch-live-indexing:4.0.1mem_limit: 1gdepends_on:elasticsearch:condition: service_startedsearch-reindexing:condition: service_completed_successfullyenvironment:ALFRESCO_ACCEPTED_CONTENT_MEDIA_TYPES_CACHE_BASE_URL: http://transform-core-aio:8090/transform/configALFRESCO_SHAREDFILESTORE_BASEURL: http://shared-file-store:8099/alfresco/api/-default-/private/sfs/versions/1/file/SPRING_ACTIVEMQ_BROKERURL: nio://activemq:61616SPRING_ELASTICSEARCH_REST_URIS: http://elasticsearch:9200search-reindexing:image: quay.io/alfresco/alfresco-elasticsearch-reindexing:4.0.1mem_limit: 1grestart: on-failure:10environment:ALFRESCO_ACCEPTED_CONTENT_MEDIA_TYPES_CACHE_BASE_URL: http://transform-core-aio:8090/transform/configSPRING_ACTIVEMQ_BROKERURL: nio://activemq:61616SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/alfrescoSPRING_DATASOURCE_USERNAME: alfrescoSPRING_DATASOURCE_PASSWORD: alfrescoSPRING_ELASTICSEARCH_REST_URIS: http://elasticsearch:9200depends_on:postgres:condition: service_startedelasticsearch:condition: service_startedalfresco:condition: service_healthyactivemq:image: alfresco/alfresco-activemq:5.18-jre17-rockylinux8mem_limit: 1gports:- "8161:8161" # Web Console- "5672:5672" # AMQP- "61616:61616" # OpenWire- "61613:61613" # STOMPdigital-workspace:image: quay.io/alfresco/alfresco-digital-workspace:4.4.1mem_limit: 128menvironment:APP_CONFIG_PROVIDER: "ECM"APP_CONFIG_AUTH_TYPE: "BASIC"BASE_PATH: ./APP_CONFIG_PLUGIN_PROCESS_SERVICE: "false"APP_CONFIG_PLUGIN_MICROSOFT_ONLINE: "false"APP_BASE_SHARE_URL: "http://localhost:8080/workspace/#/preview/s"control-center:image: quay.io/alfresco/alfresco-control-center:8.4.1mem_limit: 128menvironment:APP_CONFIG_PROVIDER: "ECM"APP_CONFIG_AUTH_TYPE: "BASIC"BASE_PATH: ./proxy:image: alfresco/alfresco-acs-nginx:3.4.2mem_limit: 128mdepends_on:- alfresco- digital-workspace- control-center- shareports:- "8080:8080"sync-service:image: quay.io/alfresco/service-sync:4.0.1mem_limit: 1genvironment:JAVA_OPTS: -Dsql.db.driver=org.postgresql.Driver -Dsql.db.url=jdbc:postgresql://postgres:5432/alfresco -Dsql.db.username=alfresco -Dsql.db.password=alfresco -Dmessaging.broker.host=activemq -Drepo.hostname=alfresco -Drepo.port=8080 -Ddw.server.applicationConnectors[0].type=http -XX:MinRAMPercentage=50 -XX:MaxRAMPercentage=80ports:- "9090:9090"
volumes:shared-file-store-volume:driver_opts:type: tmpfsdevice: tmpfs

将localhost替换你服务器的IP

3. 启动容器

在 docker-compose.yml 文件所在的目录下,运行以下命令启动容器:
执行构建命令

docker-compose up -d

解释:
docker-compose up 命令用于启动由 docker-compose.yml 文件定义的所有服务。
-d 参数表示在后台运行容器。
4. 验证部署
启动容器后,可以通过访问 http://localhost:8080/alfresco 来验证 Alfresco Content Services 是否成功部署。首次访问时,需要进行一些初始设置,例如创建管理员账户等。
5. 停止和删除容器
如果需要停止和删除容器,可以使用以下命令:
这个命令是集体删除容器,慎用。

docker-compose down

解释:
docker-compose down 命令会停止并删除由 docker-compose.yml 文件定义的所有服务及其相关的网络和卷(如果使用了 --volumes 参数)。

注意事项
配置调整:根据实际需求,可以调整 docker-compose.yml 文件中的配置,例如更改端口映射、环境变量等。

在这里插入图片描述

docker ps -a

在这里插入图片描述

笔者是用unbuntu桌面版访问localhost,如果是部署在没有桌面的服务器,在构建之前先把localhost替换成服务器IP!
在这里插入图片描述
在这里插入图片描述
admin admin

在这里插入图片描述

相关文章:

Alfresco Content Services dockerCompose自动化部署详尽操作

Alfresco Content Services docker社区部署文档 Alfresco Content Services简介 Alfresco Content Services(简称ACS)是一款功能完备的企业内容管理(ECM)解决方案,主要面向那些对企业级内容管理有高要求的组织。具体…...

学习第七十六行

提高github下载速度方法 1.github转码云 2.https://github.com.cnpmjs.org com后面加东西 对于面试笔试,最好方法刷力扣,1000题包进大厂的...

YOLOv11改进,YOLOv11检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...

一个基于Python+Appium的手机自动化项目~~

本项目通过PythonAppium实现了抖音手机店铺的自动化询价,可以直接输出excel,并带有详细的LOG输出。 1.excel输出效果: 2. LOG效果: 具体文件内容见GitCode: 项目首页 - douyingoods:一个基于Pythonappium的手机自动化项目,实现了…...

【后端开发】字节跳动青训营之性能分析工具pprof

性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接: 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…...

Linux:线程池和单例模式

一、普通线程池 1.1 线程池概念 线程池:一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价&…...

使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录

editor中设置了using exculexing 模拟远程加载addressable可以实现资源热更新,build后的软件却没有成功。 iis服务器中mime中需要设置bundle的文件扩展名,时editor成功,build后失败 原因没有设置hash的扩展名,设置后editor和buil…...

TikTok广告投放优化策略:提升ROI的核心技巧

在短许多品牌和商家纷纷投入广告营销,争夺这片潜力巨大的市场。然而,在激烈的竞争环境中,如何精准有效地投放广告,优化广告效果,实现更高的投资回报率(ROI)成为了广告主关注的核心。 一. 精准受…...

Hash表

哈希表存储结构(开放寻址法,拉链法)字符串哈希方式(添加、查找h(x)) 常见从0~10^9映射到0~10^5就要对10^5取mod(取模一般要质数最好)但是可能会有冲突 1.拉链法:O(1),每…...

题解:P10972 I-Country

题目传送门 思路 因为占据的连通块的左端点先递减、后递增,右端点先递增、后递减,所以设 f i , j , l , r , x ( 0 / 1 ) , y ( 0 / 1 ) f_{i,j,l,r,x(0/1),y(0/1)} fi,j,l,r,x(0/1),y(0/1)​ 为前 i i i 行中,选择 j j j 个方格&#x…...

linux常用加固方式

目录 一.系统加固 二.ssh加固 三.换个隐蔽的端口 四.防火墙配置 五.用户权限管理 六.暴力破解防护 七.病毒防护 八.磁盘加密 九.双因素认证2FA 十.日志监控 十一.精简服务 一.系统加固 第一步:打好系统补丁 sudo apt update && sudo apt upgra…...

笔灵ai写作技术浅析(二):自然语言处理

一、词法分析(Lexical Analysis) 1.1 概述 词法分析是NLP的第一步,主要任务是将连续的文本分割成有意义的单元(词或词组),并对这些单元进行标注,如词性标注(POS tagging)。词法分析的质量直接影响后续的句法分析和语义理解。 1.2 技术细节 1.分词(Tokenization)…...

PyCharm介绍

PyCharm的官网是https://www.jetbrains.com/pycharm/。 以下是在PyCharm官网下载和安装软件的步骤: 下载步骤 打开浏览器,访问PyCharm的官网https://www.jetbrains.com/pycharm/。在官网首页,点击“Download”按钮进入下载页面。选择适合自…...

深度解析:基于Vue 3与Element Plus的学校管理系统技术实现

一、项目架构分析 1.1 技术栈全景 核心框架:Vue 3 TypeScript UI组件库:Element Plus(含图标动态注册) 状态管理:Pinia(用户状态持久化) 路由方案:Vue Router(动态路…...

Python从0到100(八十五):神经网络-使用迁移学习完成猫狗分类

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…...

苍穹外卖 项目记录 day09 历史订单

文章目录 查询历史订单查询订单详情取消订单再来一单 查询历史订单 分页查询历史订单可以根据订单状态查询展示订单数据时,需要展示的数据包括:下单时间、订单状态、订单金额、订单明细(商品名称、图片) #OrderController/*** 历…...

记录 | 基于Docker Desktop的MaxKB安装

目录 前言一、MaxKBStep 1Step2 二、运行MaxKB更新时间 前言 参考文章:如何利用智谱全模态免费模型,生成大家都喜欢的图、文、视并茂的文章! MaxKB的Github下载地址 参考视频:【2025最新MaxKB教程】10分钟学会一键部署本地私人专属…...

WordPress web-directory-free插件存在本地文件包含导致任意文件读取漏洞(CVE-2024-3673)

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...

LLM:BERT or BART 之BERT

文章目录 前言一、BERT1. Decoder-only2. Encoder-only3. Use of Bidirectional Context4. Masked Language Model (MLM)5. Next Sentence Prediction (NSP)6. Fine-tune1、情感分析2、句对分析3、命名实体识别(NER) 7. BERT总结 总结 前言 NLP选手对这…...

EtherCAT主站IGH-- 18 -- IGH之fsm_mbox_gateway.h/c文件解析

EtherCAT主站IGH-- 18 -- IGH之fsm_mbox_gateway.h/c文件解析 0 预览一 该文件功能`fsm_mbox_gateway.c` 文件功能函数预览二 函数功能介绍`fsm_mbox_gateway.c` 中主要函数的作用1. `ec_fsm_mbg_init`2. `ec_fsm_mbg_clear`3. `ec_fsm_mbg_transfer`4. `ec_fsm_mbg_exec`5. `e…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...