Compare commits

...

10 Commits

Author SHA1 Message Date
dcbe1b6728 update 2025-07-04 17:07:09 +08:00
b4416260fd update 2025-07-04 09:50:30 +08:00
bb9639ce0c update 2025-07-03 17:15:06 +08:00
28336adc87 update 2025-07-03 17:12:58 +08:00
7e7424fc85 update 2025-07-03 17:09:49 +08:00
21de56d967 update 2025-07-02 16:54:12 +08:00
176e6afae7 update 2025-07-02 16:49:41 +08:00
a432723770 update 2025-07-02 16:48:04 +08:00
2664c7741d update 2025-07-02 16:46:21 +08:00
716e20675e update 2025-07-02 16:44:04 +08:00
10 changed files with 213 additions and 38 deletions

View File

@ -10,6 +10,6 @@ class Config extends AbstractConstants
{
public static function getDomain()
{
return env('APP_DOMAIN', '');
return env('APP_DOMAIN', 'http://127.0.0.1');
}
}

View File

@ -69,10 +69,10 @@ class UploadController extends AbstractController
}
// 校验类型
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
if (!in_array($file->getClientMediaType(), $allowedTypes)) {
return $this->response->json(['code' => 415, 'msg' => '不支持的图片格式']);
}
// $allowedTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
// if (!in_array($file->getClientMediaType(), $allowedTypes)) {
// return $this->response->json(['code' => 415, 'msg' => '不支持的图片格式']);
// }
// 限制大小 (例如 5MB)
$maxSize = 5 * 1024 * 1024;
@ -98,7 +98,7 @@ class UploadController extends AbstractController
return $this->response->json([
'errno' => 0,
'msg' => '上传成功!!',
'msg' => '上传成功!!~',
'data' => [
'url' => Config::getDomain() . $url,
]

View File

@ -37,6 +37,12 @@ class WebsiteController extends AbstractController
$model->app_description = $this->request->post('app_description');
$model->app_name = $this->request->post('app_name');
$model->app_domain = $this->request->post('app_domain');
$model->app_filing = $this->request->post('app_filing');
$model->app_filing_url = $this->request->post('app_filing_url');
$model->app_logo = $this->request->post('app_logo');
$model->app_extra = $this->request->post('app_extra');
$model->app_template = $this->request->post('template');
$model->app_extra_tag = $this->request->post('app_extra_tag');
$model->save();
return $this->response->json([]);
@ -77,7 +83,7 @@ class WebsiteController extends AbstractController
if (!$query) {
return $this->response->json(['code' => 400, 'msg' => 'id 有误']);
}
$query['template'] = $query['app_template'];
return $this->response->json(['code' => 0, 'msg' => 'ok', 'data' => $query]);
}
@ -100,6 +106,12 @@ class WebsiteController extends AbstractController
$query->app_name = $this->request->post('app_name');
$query->app_domain = $this->request->post('app_domain');
$query->app_keywords = $this->request->post('app_keywords');
$query->app_filing = $this->request->post('app_filing');
$query->app_filing_url = $this->request->post('app_filing_url');
$query->app_logo = $this->request->post('app_logo');
$query->app_extra = $this->request->post('app_extra');
$query->app_template = $this->request->post('template');
$query->app_extra_tag = $this->request->post('app_extra_tag');
$query->save();

View File

@ -38,6 +38,7 @@ class NewsFormModel
$model->description = $this->attributes['description'];
$model->cover = $this->attributes['cover'];
$model->content = $this->attributes['content'];
$model->platform = $this->attributes['platform'];
$model->save();
}
}

View File

@ -18,6 +18,14 @@ namespace App\Model;
* @property string $app_domain
* @property int $is_delete
* @property string $app_keywords
* @property string $app_filing
* @property string $app_filing_url
* @property string $app_extra
* @property string $app_logo
* @property int $app_template
* @property string $app_telephone
* @property string $app_download_url
* @property string $app_extra_tag
*/
class AppWebsiteConfig extends Model
{
@ -34,5 +42,5 @@ class AppWebsiteConfig extends Model
/**
* The attributes that should be cast to native types.
*/
protected array $casts = ['id' => 'integer', 'created_at' => 'datetime', 'created_by' => 'integer', 'updated_at' => 'datetime', 'updated_by' => 'integer', 'is_delete' => 'integer'];
protected array $casts = ['id' => 'integer', 'created_at' => 'datetime', 'created_by' => 'integer', 'updated_at' => 'datetime', 'updated_by' => 'integer', 'is_delete' => 'integer', 'app_template' => 'integer'];
}

View File

@ -46,10 +46,11 @@ class NewsService extends BaseService
* @param int $page
* @return array
*/
public function index(int $limit = 30, int $page = 1): array
public function index(int $id, int $limit = 30, int $page = 1): array
{
$query = AppNews::formatQuery(['created_at'])
->where('is_delete', 0)
->where('platform', $id)
->select(['id'])
->orderBy('id', 'desc');;
$pagination = $query->paginate($limit, page: $page);

View File

@ -1,8 +1,7 @@
<?php
$articleLocation = array_map(fn($case) => [
'label' => ucfirst($case->toString()),
'value' => $case->value,
], \App\Enums\LocationEnum::cases());
$platforms = call_user_func(function () {
return \App\Model\AppWebsiteConfig::query()->where('is_delete', 0)->get()->toArray();
});
?>
<!DOCTYPE html>
<html lang="zh-cn">
@ -21,6 +20,17 @@ $articleLocation = array_map(fn($case) => [
<form class="layui-form" action="">
<div class="mainBox">
<div class="main-container mr-5">
<div class="layui-form-item">
<label class="layui-form-label required">发布平台</label>
<div class="layui-input-block">
<select name="platform" lay-search="">
<option value="">请选择</option>
<?php foreach ($platforms ?: [] as $platform): ?>
<option value="<?= $platform['id'] ?>"><?= $platform['app_name'] ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">文章标题</label>
<div class="layui-input-block">

View File

@ -1,3 +1,8 @@
<?php
$platforms = call_user_func(function () {
return \App\Model\AppWebsiteConfig::query()->where('is_delete', 0)->get()->toArray();
});
?>
<!DOCTYPE html>
<html lang="zh-cn">
<head>
@ -16,6 +21,17 @@
<input type="hidden" name="id" value="" autocomplete="off">
<div class="mainBox">
<div class="main-container mr-5">
<div class="layui-form-item">
<label class="layui-form-label required">发布平台</label>
<div class="layui-input-block">
<select name="platform" lay-search="">
<option value="">请选择</option>
<?php foreach ($platforms ?: [] as $platform): ?>
<option value="<?= $platform['id'] ?>"><?= $platform['app_name'] ?></option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label required">文章标题</label>
<div class="layui-input-block">
@ -194,6 +210,9 @@
document.querySelector('[id="cover"]').src = res.data.cover
$("[name=cover]").val(res.data.cover);
$("select[name=platform]").val(res.data.platform);
layui.form.render("select");
editor.setHtml(res.data.content)
// ajax产生错误

View File

@ -19,25 +19,61 @@
<div class="layui-form-item">
<label class="layui-form-label">网站名称</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_name" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_name" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站logo</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="logo_upload_btn">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<img style="max-height: 50px;" src="" id="app_logo">
<input type="hidden" name="app_logo" value="" class="layui-input" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站描述</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_description" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_description" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_keywords" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_keywords" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">公司名称</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_company" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_company" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号链接地址</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing_url" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">模板</label>
<div class="layui-input-inline layui-input-wrap">
<input type="radio" name="template" value="2" title="模板2">
{{-- <input type="radio" name="sex" value="2" title="">--}}
{{-- <input type="radio" name="sex" value="nv" title="" checked>--}}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">extra_tag</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_extra_tag" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
@ -54,9 +90,37 @@
<script>
// api
const INSERT_API = "/admin/api/website/config/insert";
const UPLOAD_API = '/upload/image' // 上传图片
layui.use(['upload', 'jquery', 'popup'], function(){
const $ = layui.jquery;
const upload = layui.upload;
// 上传logo
upload.render({
elem: '#logo_upload_btn' //绑定元素
,url: UPLOAD_API // 上传接口,实际使用时改成您自己的上传接口即可。
,accept: 'images' // 限制为图片类型
,exts: 'jpg|jpeg|png|gif|ico' // 允许上传的文件格式,加入 ico 格式
,before: function(obj){ //obj参数包含的信息跟 choose回调完全一致可参见上文。
console.log(obj)
}
,done: function(res){
//上传完毕回调
console.log(res)
// 若上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
// 上传成功的一些操作
// …
document.querySelector('[id="app_logo"]').src = res.data.url
$("input[name=app_logo]").val(res.data.url);
}
,error: function(e){
console.log(e)
//请求异常回调
}
});
layui.form.on("submit(insert)", function (data) {
console.log(data)

View File

@ -20,25 +20,61 @@
<div class="layui-form-item">
<label class="layui-form-label">网站名称</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_name" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_name" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站logo</label>
<div class="layui-input-block">
<button type="button" class="layui-btn" id="logo_upload_btn">
<i class="layui-icon">&#xe67c;</i>上传图片
</button>
<img style="max-height: 50px;" src="" id="app_logo">
<input type="hidden" name="app_logo" value="" class="layui-input" autocomplete="off">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">网站描述</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_description" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_description" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">关键词</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_keywords" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_keywords" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">公司名称</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_company" lay-verify="required" autocomplete="off" lay-affix="clear" class="layui-input">
<input type="text" name="app_company" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">备案号链接地址</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_filing_url" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">模板</label>
<div class="layui-input-inline layui-input-wrap">
<input type="radio" name="template" value="2" title="模板2">
{{-- <input type="radio" name="sex" value="2" title="">--}}
{{-- <input type="radio" name="sex" value="nv" title="" checked>--}}
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">extra_tag</label>
<div class="layui-input-inline layui-input-wrap">
<input type="text" name="app_extra_tag" autocomplete="off" lay-affix="clear" class="layui-input">
</div>
</div>
<div class="layui-form-item">
@ -57,10 +93,11 @@
// API
const VIEW_API = "/admin/api/website/config/view"; // 获取关键词数据
const SAVE_API = "/admin/api/website/config/save"; // 重新保存数据
const UPLOAD_API = '/upload/image' // 上传图片
layui.use(['upload', 'jquery', 'popup', 'form'], function(){
const $ = layui.jquery;
const upload = layui.upload;
initViewData()
layui.form.on("submit(save)", function (data) {
layui.$.ajax({
@ -81,7 +118,32 @@
});
return false;
});
// 上传logo
upload.render({
elem: '#logo_upload_btn' //绑定元素
,url: UPLOAD_API // 上传接口,实际使用时改成您自己的上传接口即可。
,accept: 'images' // 限制为图片类型
,exts: 'jpg|jpeg|png|gif|ico' // 允许上传的文件格式,加入 ico 格式
,before: function(obj){ //obj参数包含的信息跟 choose回调完全一致可参见上文。
console.log(obj)
}
,done: function(res){
//上传完毕回调
console.log(res)
// 若上传失败
if(res.code > 0){
return layer.msg('上传失败');
}
// 上传成功的一些操作
// …
document.querySelector('[id="app_logo"]').src = res.data.url
$("input[name=app_logo]").val(res.data.url);
}
,error: function(e){
console.log(e)
//请求异常回调
}
});
function initViewData() {
let viewId = layui.url().search['id']
$.ajax({
@ -92,6 +154,10 @@
method: 'get',
dataType: "json",
success: function (res) {
// ajax产生错误
if (res.code) {
layui.popup.failure(res.msg);
}
// 赋值表单
layui.each(res.data, function (key, value) {
@ -109,23 +175,17 @@
});
const form = layui.form;
const selectedPlatforms = res.data.platform; // 后端数据
selectedPlatforms?.forEach(val => {
// 设置 value 对应的 checkbox 为选中
document.querySelectorAll('input[name="platform[]"]').forEach(el => {
if (el.value == val) {
el.checked = true;
}
});
const app_template = res.data.app_template
console.log(document.querySelectorAll('input[name="template"]'))
document.querySelectorAll('input[name="template"]').forEach(el => {
if (el.value == app_template) {
el.checked = true;
}
// console.log(el)
});
form.render('checkbox'); // 重新渲染
// ajax产生错误
if (res.code) {
layui.popup.failure(res.msg);
}
document.querySelector('[id="app_logo"]').src = res.data.app_logo
form.render('radio'); // 重新渲染
}
});