# 进销存管理系统基础版手册v1.0.0 **Repository Path**: grape-branch/handbook-jxc-mini ## Basic Information - **Project Name**: 进销存管理系统基础版手册v1.0.0 - **Description**: 基础版与专业版的区别是,无产品图片、无备注、没有会员组、没有可选仓库权限、没有代办权限、没有账务管理、没有打印单据、没有批量出入库等功能,其它和专业版一样。如果你不需要批量功能、单据打印和账务管理功能,基础版可以满足。否则建议使用专业版,专业版包含基础版的全部功能。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-14 - **Last Updated**: 2025-12-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用进销存管理系统基础版v1.0.0 > 通用进销存管理系统基础版,是一款专为中小企业设计的基于Web的库存管理解决方案,旨在提高企业的运营效率,实现销售、采购和库存的高效管理。 自带本地运行环境 nginx1.20.2+php5.4.9+mysql5.5.62 精简最少体积占用,运行最小内存占用(1GB内存,512MB内存照样能跑),兼容老爷机或老服务器,一切大道从简。 > 基础版与专业版的区别是,无产品图片、无备注、没有会员组、没有可选仓库权限、没有代办权限、没有账务管理、没有打印单据、没有批量出入库等功能,其它和专业版一样。如果你不需要批量功能、单据打印和账务管理功能,基础版可以满足。否则建议使用专业版,专业版包含基础版的全部功能。 ## 简单使用 > 原生手写MVC(兼容PHP5.4+),它简单、易用、轻量,并且易于扩展。 start.bat 一键开启 stop.bat 一键关闭 默认匿名用户,输入验证码直接登录 (匿名用户属于游客角色,只能看,不能增删改和使用上传接口) 用户名 anonymous 密码 123456 管理员用户 (管理员角色开放所有权限) 用户名 admin 密码 admin 管理员用户登录后台 http://localhost/admin/ (或前端点击右上角控制台) 后台点击右上角三个点,点开后,点击重置系统,恢复出厂设置。 ## 系统架构与技术栈 采用Web架构,用户可以通过浏览器访问系统,无需安装客户端,具备跨平台和易用性。系统基于B/S(Browser/Server)模式,前端使用HTML、CSS和JavaScript等技术,后端采用PHP服务器端语言,搭配MySQL数据库管理系统存储数据。 ## 进销存管理模块 能够帮助公司实现精细化管理,提高工作效率,减少错误,降低运营成本。例如,通过库存预警,公司可以及时补充货物,避免断货;通过销售数据分析,可以调整销售策略,提升销售额;通过采购管理,可以优化供应商关系,降低成本。 1. 权限管理(可设置每个员工对每个模块的增删改查的精确控制) 1.1 员工管理 1.2 角色管理 1.3 权限菜单 2. 入库管理(主要是与供应商之间,采购入库和退给供应商) 2.1 产品入库 2.2 入库记录 2.3 退回供应商 2.4 退回记录 3. 库存管理(可以多仓库之间调拨商品和查看库存预警) 3.1 库存查询 3.2 库存调拨 3.3 调拨记录 3.4 库存报警 4. 出库管理(主要是与顾客之间,销售给顾客和接收顾客退货,支持产品报废功能) 4.1 产品销售 4.2 销售记录 4.3 顾客退货 4.4 退货记录 4.5 产品报废 4.6 报废记录 5. 会员管理(可以跟踪每个会员的购物记录,退货记录,积分兑换礼品的记录,支持会员生日预警与问候) 5.1 添加会员 5.2 会员列表 5.3 会员兑换 5.4 兑换记录 5.5 生日报警 6. 供应商管理(可以跟踪每个供应商的进货记录,退货记录) 6.1 添加供应商 6.2 供应商列表 7. 仓库管理(可以管理无限多个仓库) 7.1 添加仓库 7.2 仓库列表 8. 类别管理(支持无限极分类) 8.1 添加分类 8.2 分类列表 9. 计量单位(已内置个、包、盒、瓶、件、箱6个计量单位) 9.1 添加单位 9.2 单位列表 10. 统计报表(统计每个供应商,每个会员) 10.1 进货统计 10.2 销售统计 10.3 退回供应商 10.4 顾客退货 10.5 兑换统计 10.6 调拨统计 10.7 报废统计 10.8 工资统计 11. 媒体管理(对上传的附件进行管理,可以计算找出孤立的文件进行删除) 11.1 媒体列表 11.2 上传文件 12. 系统管理(对系统进行基本设置,操作日志是所有的数据增删改操作都记录日志) 12.1 系统设置 12.2 操作日志 13. 恢复出厂(此操作在右上角三个点点开后,有操作权限的管理员点击重置系统恢复系统初始状态,慎用!!!) ## 系统特点 1. 简单易用:界面设计简洁,操作流程直观,即使对计算机不熟悉的员工也能快速上手。 2. 数据安全:采用先进的加密技术和防火墙保护,确保数据在传输和存储过程中的安全。 3. 实时同步:通过Web接口,各个部门能实时查看和更新数据,保证信息的一致性。 4. 扩展性:系统设计时考虑了未来可能的需求变化,易于进行功能扩展和升级。 5. 使用期限:没有任何功能限制和使用时长限制。重置系统后又可在新环境中重新使用,无限期使用。 ## mvc 使用命名空间 > PHP版本 5.4+ * config.php 配置文件(如连接数据库等) * index.php 入口文件,可以用 nginx 或者 apache 隐藏入口 * autoload.php 类自动加载器 * mvc.sql 初始化数据库导入 * mvc/ 迷你mvc目录 + Controller.php 基础控制器 + Facade.php 门面静态化 + Model.php 模型类(已门面) + View.php 视图类(已门面) + Util.php 实用工具(已门面) + cache_str/ 单点登录保存串 + tpl/ 模板编译目录 * controller/ 控制器目录 * model/ 模型目录 * view/ 视图目录 * facade/ 门面静态化目录 * static/ 静态文件目录 * util/ 扩展工具目录 ## 配置信息 > html/config.php ### 本地调试 > 新建 mvc_jxc_mini 数据库,字符集 utf8 -- UTF-8 Unicode 校对 utf8_unicode_ci 将目录下 mvc_jxc_mini.sql 导入即可。 ```php 'Asia/Shanghai', // 数据库配置信息 'db' => [ 'type' => 'mysql', 'host' => '127.0.0.1', 'dbname' => 'mvc_jxc_mini', 'port' => '3306', 'charset' => 'utf8', 'username' => 'root', 'password' => '', ], // 调试模式 'debug' => true, // 记录操作日志 'log' => false, // 数据库零查询静态缓存周期(秒,0关闭) 'cache' => 0, ``` ### 线上设置 > 根据服务器所在国家设置时区,数据库配置信息,关闭调试模式,打开记录操作日志,启用数据库零查询静态缓存(示例为关闭) ```php 'Asia/Shanghai', // 数据库配置信息 'db' => [ 'type' => 'mysql', 'host' => '127.0.0.1', 'dbname' => 'mvc_jxc_mini', 'port' => '3306', 'charset' => 'utf8', 'username' => 'root', 'password' => '', ], // 调试模式 'debug' => false, // 记录操作日志 'log' => true, // 数据库零查询静态缓存周期(秒,0关闭) 'cache' => 0, ``` ## nginx 隐藏入口重写规则 > nginx.htaccess 1. 根目录 ```shell location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$1 last; } } ``` 2. 子目录 ```shell location /sub-dir/ { if (!-e $request_filename) { rewrite ^/sub-dir/(.*)$ /sub-dir/index.php/$1 last; } } ``` ## apache 隐藏入口重写规则 > .htaccess 1. 根目录 ```shell RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] ``` 2. 子目录 ```shell RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /sub-dir/index.php [L] ``` ## 注意事项 * 重置系统,恢复出厂设置,删除用户数据,恢复系统到一个初始状态。 * 如果系统破坏,导入数据库`html/mvc_jxc_mini.sql`恢复系统到一个初始状态。 ## 演示地址 > 链接 https://yesu.love/jxc_mini/ ## 使用手册 > 链接 https://yesu.love/jxc_mini/readme.html ### 1. 重置系统 > 新系统在使用前进行重置,恢复到出厂设置。点击左上角三个点,弹出的菜单中选择【重置系统】恢复到出厂设置 ![image-20251105161256983](assets/image-20251105161256983.png) ![image-20251105161410494](assets/image-20251105161410494.png) ### 2. 设置系统 > 进行基本设置,比如介绍会员增加积分,smtp邮件设置等,QQ邮箱授权码获取见后页 #### smtp邮箱设置 ![image-20251105162913542](assets/image-20251105162913542.png) #### QQ邮箱授权码 > QQ邮箱授权码在QQ邮箱后台获取【设置】-【账号】- **POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务** ![image-20251106102145850](assets/image-20251106102145850.png) ![image-20251106102405327](assets/image-20251106102405327.png) #### 发送测试邮件 > 发送一份测试邮件 Test Email ,去收件箱,收到一封 Test Email 的邮件,表明smtp邮箱配置成功。 ![image-20251106101348574](assets/image-20251106101348574.png) ### 3. 添加角色-权限-员工 > 参考管理员权限,开放所有权限,游客权限,仅仅支持查看,不支持任何增删改和上传权限。根据实际需要分配可使用的菜单功能的操作权限 ![image-20251105165337383](assets/image-20251105165337383.png) > 如果你不需要游客登陆展示功能,可以在员工管理中禁用。但是管理员是不可禁用的。 ![image-20251105165601897](assets/image-20251105165601897.png) 对员工分配权限操作是非常重要的事项,权限分配不当,会导致系统破坏。因此单开一讲,请参照附录**权限管理精讲** ### 4. 添加会员(可选) > 虽然为可选,但添加会员更加方便对客户进行管理和统计 ![image-20251105170048667](assets/image-20251105170048667.png) > 后续添加会员可以选择介绍人,介绍人增加积分,前提是系统设置中已经设置【介绍会员增加积分】,这里设置中为5 ![image-20251105170618470](assets/image-20251105170618470.png) > 这样在会员列表中可以详细的统计会员的购物记录、退货记录、积分兑换礼物的记录等 ![image-20251105171338871](assets/image-20251105171338871.png) ### 5. 添加供应商(可选) > 虽然可选,但添加供应商可以更加方便的统计和管理从供应商的进货记录和退货给供应商的记录等 ![image-20251105171929942](assets/image-20251105171929942.png) ### 6. 添加仓库(可选) > 你可以添加多个仓库,并设置一个默认仓库 ![image-20251105172259476](assets/image-20251105172259476.png) ### 7. 添加分类(可选) > 可以更好的对货品进行管理,支持无限极分类 ![image-20251105184910715](assets/image-20251105184910715.png) ### 8. 添加单位(可选) > 系统内置了【箱、件、瓶、盒、包、个】6个计量单位,可以添加更多或删减 ![image-20251105184948085](assets/image-20251105184948085.png) ## 开始使用系统 ### 入库管理 #### 产品入库 > 首次入库使用新产品入库,之后同样产品可以快速使用已有产品入库,并可以选择不同的供应商。 - 新产品入库 ![image-20251106075020207](assets/image-20251106075020207.png) ![image-20251106075055485](assets/image-20251106075055485.png) - 已有产品入库 ![image-20251106080135902](assets/image-20251106080135902.png) ![image-20251106080410985](assets/image-20251106080410985.png) #### 入库记录 ![image-20251106080920589](assets/image-20251106080920589.png) #### 退回供应商 ![image-20251106081117121](assets/image-20251106081117121.png) #### 退回记录 ![image-20251106081305047](assets/image-20251106081305047.png) ### 库存管理 #### 库存查询 ![image-20251106081543372](assets/image-20251106081543372.png) #### 库存调拨 ![image-20251106081635334](assets/image-20251106081635334.png) #### 调拨记录 ![image-20251106081832195](assets/image-20251106081832195.png) #### 库存报警 > 入库时,设置库存报警数量,库存低于这个数量时产生库存不足的报警。默认设置0不报警。 ### 出库管理 #### 产品销售 ![image-20251106082926457](assets/image-20251106082926457.png) ![image-20251106083017361](assets/image-20251106083017361.png) #### 销售记录 ![image-20251106083102237](assets/image-20251106083102237.png) #### 顾客退货 ![image-20251106083227359](assets/image-20251106083227359.png) #### 退货记录 ![image-20251106083334179](assets/image-20251106083334179.png) #### 产品报废 ![image-20251106083424601](assets/image-20251106083424601.png) #### 报废记录 ![image-20251106083537392](assets/image-20251106083537392.png) ### 会员管理 #### 会员列表 ##### 会员购物记录 ![image-20251106083922226](assets/image-20251106083922226.png) ![image-20251106083938298](assets/image-20251106083938298.png) ##### 会员退货记录 ![image-20251106084025718](assets/image-20251106084025718.png) #### 会员兑换 ![image-20251106084502683](assets/image-20251106084502683.png) ![image-20251106084543102](assets/image-20251106084543102.png) #### 兑换记录 ![image-20251106090409234](assets/image-20251106090409234.png) #### 生日报警 > 点击【已问候取消报警】报警消失,直到下一年提前报警,提前多少天报警可以在 【系统管理】-【系统设置】中设置。 ![image-20251106090510284](assets/image-20251106090510284.png) ### 供应商管理 #### 供应商列表 ##### 从供应商进货记录 ![image-20251106091004213](assets/image-20251106091004213.png) ![image-20251106091021266](assets/image-20251106091021266.png) ##### 退货给供应商记录 ![image-20251106091046225](assets/image-20251106091046225.png) ### 统计报表 #### 进货统计 ![image-20251106092142745](assets/image-20251106092142745.png) #### 销售统计 ![image-20251106092207885](assets/image-20251106092207885.png) #### 退回供应商 ![image-20251106092234099](assets/image-20251106092234099.png) #### 顾客退货 ![image-20251106092320370](assets/image-20251106092320370.png) #### 兑换统计 ![image-20251106092348210](assets/image-20251106092348210.png) #### 调拨统计 ![image-20251106092406471](assets/image-20251106092406471.png) #### 报废统计 ![image-20251106092422581](assets/image-20251106092422581.png) #### 工资统计 ![image-20251106092508123](assets/image-20251106092508123.png) ### 系统管理 #### 操作日志 > 执行的每一次产生增删改和上传的操作,都详细记录日志,方便对每一次的操作进行历史追查。 ![image-20251106092946987](assets/image-20251106092946987.png) ## 附录:权限管理精讲 > 链接 https://yesu.love/jxc/rbac.html (此为专业版权限精讲但包含基础版全部的权限设置) ## 附录:二开注意事项 > 你可以对系统进行二次开发,如果你有一点点关于php和mysql的基础知识,再熟悉一点smarty模板语法。二开也是非常容易的。下面是二开步骤。 ### 1. 定义路由 > 浏览器通过地址 /admin/produit/produit_add.html 访问时,这段地址称为路由,程序根据这个路由进行响应,就是控制器和方法,控制器通常是一个类文件的名称,文件中的使用命名空间的类名和文件名相同,根目录 config.php 中定义后端路由,格式: '路由' => '控制器名/方法名' ![image-20251111075152185](assets/image-20251111075152185.png) > 例如:以 config.php 中的 admin 模块,入库管理的`'路由' => '控制器名/方法名'` ![image-20251210172902020](assets/image-20251210172902020.png) ### 2. 控制器类 ![image-20251210173138155](assets/image-20251210173138155.png) ### 3. 编写方法 > 找到 /controller/admin/Produit.php 查看入库方法 ![image-20251110201730411](assets/image-20251110201730411.png) > 关于二开操作数据库的模型使用和供显示的视图使用,分别参照附录**二开模型使用**和**二开视图使用**。 ### 4. 菜单注册 ![image-20251210162844719](assets/image-20251210162844719.png) ### 5. 分配权限 ![image-20251210163534463](assets/image-20251210163534463.png) 经过上面1-5个步骤,确保: 1. 路由通了,config.php 中定义,否则报404错误 2. 找到控制器类名同名文件,开始按照命名空间,编写类中的方法,以代码来响应路由的动作 3. 在响应路由的动作之前,你需要在权限菜单中注册控制器和方法,否则报功能不存在 4. 给当前登陆的用户分配可以操作的权限【菜单】【显示】【功能】 5. 熟悉模型 Model 操作数据库,熟悉 View 操作视图,可以参见附录 ## 附录:二开模型使用 > 模型主要用于操作数据库,查询保留mysql原生查询,新增和更新比原生更简洁,删除支持批量删除。 ### 1. 查询记录 ```php // 查询一个字段 $count = Model::fetchColumn("SELECT COUNT(*) FROM `test` ORDER BY `id` DESC"); // 查询一条记录 $row = Model::fetch("SELECT * FROM `test` WHERE `id`=:id", [':id' => 1]); // 查询多条记录 $rows = Model::fetchAll("SELECT * FROM `test` ORDER BY `id` DESC LIMIT 0, 10"); // 查询后按id字段值为键值进行重组 $rows = Model::fetchAll("SELECT * FROM `test` WHERE `id` IN (1, 2)", [], 'id'); ``` ### 2. 新增记录 ```php // 返回最后插入记录的ID $lastInsertId = Model::insert('test', ['title' => 'TEST', 'content' => '']); ``` ### 3. 更新记录 ```php // 返回变动记录的数量 $rowCount = Model::update('test', ['title' => '', 'content' => 'TEST'], ['id' => 1]); ``` ### 4. 删除记录 ```php // 删除一条记录,返回删除的记录数 $rowCount = Model::delete('test', ['id' => 1]); // 批量删除记录,返回删除的记录数 $rowCount = Model::delete('test', ['id' => [1, 2]]); ``` ### 5. 执行mysql语句 ```php Model::exec("ALTER TABLE `test` AUTO_INCREMENT = 1"); ``` ### 6. 提交事务 > mysql语句执行错误时进行回滚,而不写入数据库。通常用于需要执行多条语句且都不可出错的安全写入数据库的场合。 ```php // 开始事务 Model::beginTransaction(); // 错误捕获 try { // 下面三条语句任一执行错误,都不会写入数据库 Model::exec("DELETE FROM `test`"); Model::exec("ALTER TABLE `test` AUTO_INCREMENT = 1"); Model::exec("INSERT INTO `test` VALUES ('1', 'title', '')"); // 提交事务 Model::commit(); // 操作成功 exit(json_encode(['code' => 0, 'msg' => '操作成功!'])); } catch (\Exception $e) { // 错误回滚 Model::rollBack(); // 操作失败 exit(json_encode(['code' => 1, 'msg' => '操作失败!'])); } ``` ## 附录:二开视图使用 > 视图主要用于显示页面,实际上它是 smarty 模板引擎去掉冗余后精简化的单文件版本,仅仅保留大部分常用功能。 - 模板赋值 > 控制器类中通过指定 `View::assign('变量', '值');` 或者 `View::assign(['变量1' => '值1', '变量2' => '值2', ...])` - 使用模板 > 控制器类中通过 `View::display('模板路径');` 来指定,可以通过 `View::fetch('模板路径')` 获取解析后模板内容。 ### 1. 标签单元 > 在模板中,用 `{`开头,以`}` 结尾就构成一个标签单元,{紧接着的单词就是标签名。在标签单元中单词前含$(美元符)的为变量名。 #### 代码注释 ``` {* 这是注释 *} ``` #### 资源引用 ##### res 标签 ``` {* 引用 /static/res/ 下资源 *} ``` ##### include 标签 ``` {* 引入头部文件 *} {include file='admin/header.html'} ``` ##### literal 标签 > 模板引擎不分析 {literal}{/literal} 标签中内容,而直接显示,用于显示有可能包含大括号等字符信息的 javascript 脚本 ``` {literal} {/literal} ``` ### 2. 模板变量 #### 预定义变量 | 模板变量 | 对应的PHP代码 | | --------------- | --------------- | | $smarty.now | time() | | $smarty.get | $_GET | | $smarty.post | $_POST | | $smarty.cookies | $_COOKIE | | $smarty.env | $_ENV | | $smarty.server | $_SEVER | | $smarty.request | $_REQUEST | | $smarty.session | $_SESSION | | $smarty.const | define 定义变量 | ```html {$smarty.const.IA_ROOT} ``` #### 自定义变量 > 控制器中通过 View::assign 赋值的变量,模板中可以直接使用,也可以在模板中赋值(但只能简单赋值数字或字符串),在模板中现用。 - 控制器中使用 > View::assign('a', '123'); > > View::assgin('b', [1,2,3]); > > Veiw::assign(['x' => 1, 'y' => 2]); - 模板中使用 ``` {assign var='a' value='123'} {* 输出 0 *} {$a} {* 下面数组无效,将视为字符串 '[1,2,3]' *} {assign var='b' value=[1,2,3]} ``` #### 变量修饰器 ##### escape 编码器 > 功能:提供各种编码功能 > 参数:可选参数html、url、quotes、input、editor,缺省为html > html:分别替换变量中的如下字符&<>"为其html实体代码,用于按原样输出html源代码; > url:如果该变量用于储存url地址,需要进行url编码; > quotes:在单双引号字符前添加反斜杠; > input:给输入框赋值时使用; > editor:当显示通过文本编辑器录入的内容,需要用此参数; ``` {$a|escape:input} ``` ##### nl2br 换行符转 br > 功能:将换行符替换成
``` {$a|nl2br} ``` ##### default 默认值 > 功能:为变量设置一个默认值,当变量为空或者未分配的时候,将由默认值替代输出 ``` {$a|default:'1'} ``` ##### truncate 字符串截取 > 功能:字符串截取。从字符串开始处截取某长度的字符。默认会在末尾追加省略号。 ``` {$a|truncate:20:'...'} ``` ##### strip_tags 去除标签 > 功能:去除<和>标签,包括在<和>之间的任何内容。 ``` {$a|strip_tags} ``` ##### price 格式化价格 > 功能:格式化价格。 ``` {$a|price} ``` ##### date 日期格式化 > 功能:格式化本地时间和日期。 ``` {$smarty.now|date:Y-m-d H:i:s} ``` ##### modifier 自定义修饰器 > 功能:调用php自定义函数。 > 格式:{$var|modifier:user_func} 注意:通常 user_func 后面跟若干参数,而不是要处理的数据。但是也可能会出现要处理的数据处于参数的位置或者第n个位置。因此对 modifier 函数进行了改写。用于自动判断函数接收要处理数据的位置,要么在最前(默认方式),要么在最后位置,其它属于传入函数的参数。 ![image-20251112131628888](assets/image-20251112131628888.png) 这样能处理大多数 php 原生函数在模板中的调用,并且要处理的数据可以不在第一位置。 ``` {$a|modifier:str_replace('"', '')} ``` ##### 复合修饰器 > 修饰器支持多次引用,但是需注意,传入参数只能是数字或字符串,正则表达式字符串参数中的 `\` 要用 `\\` 替换 ``` {$a|strip_tags|modifier:str_replace('"', '')|modifier:preg_replace('/\\s+/sim', ' ')|modifier:mb_strimwidth(0, 140, '...', 'UTF-8')} ``` ### 3. 流程控制 #### 条件判断 if > 条件判断(if,elseif,else): > > 模板中的 if 语句和 php 中的 if 语句一样灵活易用,if 必须与 /if 成对出现,可以使用 else 和 elseif 子句。 > 多个条件之间用 and、or、&&、|| 连接,实现简单的逻辑运算。 ``` {if $a < 0} 小于零 {elseif ($a > -2 && $a < -1)} 大于负2小于-1 {else} 其它 {/if} ``` #### 循环遍历 foreach > 数组遍历(foreach,foreachelse): > > foreach 用于处理简单数组(数组中的元素的类型一致)。 > foreach 必须和 /foreach 成对使用,且必须指定 from 和 item 属性。 > foreach 可以嵌套,但必须保证嵌套中的 foreach 名称唯一。 > foreachelse 语句在 from 变量没有值的时候被执行。 > from 属性:指定被循环的数组,数组长度决定了循环的次数。 > item 属性:单个循环项目的变量名,在循环内部使用。 > name:可选属性,可以任意指定(字母、数字和下划线的组合)。 > key:可选属性,单个循环的Key值。 > > name 属性如果指定,foreach循环体内会自动生成如下变量 > $smarty.foreach.foreach_name.index表示本次循环索引,从0开始递增的整数 > $smarty.foreach.foreach_name.iteration表示本次的循环次数,从1开始递增的整数 > $smarty.foreach.foreach_name.first表示是否是第一次循环 > $smarty.foreach.foreach_name.last表示是否是最后一次循环 > $smarty.foreach.foreach_name.show表示是否有数据 > $smarty.foreach.foreach_name.total表示循环总次数,也可在循环体外使用 复杂类型,在控制器中赋值: ```php View::assign('lists', [ ['title' => 'title', 'content' => 'content'], ['title' => 'title2', 'content' => 'content2'] ]); ``` 在视图模板中,使用循环输出列表 ``` {assign var='a' value='a,b,cde'} {* 输出列表并且最后一行不显示
换行 *} {foreach from='$lists' item='item' name='item' key='pos'} key: {$pos} {$item.title}: {$item.content} | 本次循环索引 index: {$smarty.foreach.item.index} | 本次循环次数 iteration: {$smarty.foreach.item.iteration} | 是否第一次循环 first: {if $smarty.foreach.item.first}Yes{else}No{/if} | 是否最后一次循环 last: {if $smarty.foreach.item.last}Yes{else}No{/if} | 是否有数据 show: {if $smarty.foreach.item.show}Yes{else}No{/if} | 循环总次数 total: {$smarty.foreach.item.total} {if !$smarty.foreach.item.last}
{/if} {foreachelse} 列表为空 {/foreach}
在循环外获取循环总次数 total: {$smarty.foreach.item.total} ``` ![image-20251112201549080](assets/image-20251112201549080.png) ### 鸣谢 > 如果你有什么好的意见或建议,欢迎与我联系。你可以在【后台首页】,通过加V或电子邮件找到我。 ![image-20251106093538630](assets/image-20251106093538630.png) ![image-20251106093752999](assets/image-20251106093752999.png) 感谢使用! 比基础版更丰富的专业版说明书链接为 https://yesu.love/jxc/readme.html